#ifndef AJST_H #define AJST_H ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #include #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #define MAX_VARIATION 10 #define INITIAL_MAX_VARIATION 40 #define NUM_SPHERES 5 #define CUBE 1 #define VOLVOX 0 #define ELEGANS 2 #define PARAMECIUM 3 ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// /* Estruturas utilizadas no sistema */ typedef void choose_init_ranges_proc(struct model_ *mod, int NX, int NY, interval_t range[]); //tipo de função que define intervalos iniciais {range[0..MAX_PARAMS-1]} para //um modelo específico, numa imagem de tamanho {NX,NY}. typedef void put_ranges_proc(struct model_ *mod, void *vp, interval_t range[]); //tipo de função que copia o registro de intervalos de parâmetros {*p} específico de //um modelo {mod} para o vetor de intervalos {range[0..MAX_PARAMS-1]}. typedef void get_ranges_proc(struct model_ *mod, void *vp, interval_t range[]); //tipo de função que copia os intervalos de parâmetros {range[0..MAX_PARAMS-1]} //para o registro de intervalos de parâmetros {*p} específico de um modelo {mod}. typedef void put_params_proc(struct model_ *mod, void *vp, double param[]); //tipo de função que copia o registro de parâmetros {*p} específico de //um modelo {mod} para o vetor de intervalos {param[0..MAX_PARAMS-1]}. typedef void get_params_proc(struct model_ *mod, void *vp, double param[]); //tipo de função que copia os parâmetros {param[0..MAX_PARAMS-1]} //para o registro de parâmetros {*p} específico de um modelo {mod}. //estrutura que descreve um modelo: typedef struct model_ { char model_name[20]; //nome do modelo //métodos do modelo: put_params_proc *put_params; //função que lineariza parametros get_params_proc *get_params; //função que lineariza parametros put_ranges_proc *put_ranges; //função que lineariza intervalos de parametros get_ranges_proc *get_ranges; //função que lineariza intervalos de parametros choose_init_ranges_proc *choose_init_ranges; //função que gera intervalos iniciais } model; //estrutura que armazena as informacoes de um dado candidato typedef struct candidate_ { struct model_ *model; //modelo //Os parametros 0 e 1 são sempre translação em X e em Y. interval_t param[MAX_PARAMS]; //intervalos de variação dos parametros double quality; //escore de qualidade de casamento } candidate; //estrutura que armazena o conjunto de candidatos typedef struct set_of_candidates_ { candidate *candidates; //candidatos int num_candidates; //numero de candidatos } set_of_candidates; ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //parametros para o CUBE (exceto translações): typedef struct parameters_CUBE_ { double rot_x, rot_y, rot_z; //rotacoes em cada eixo double scale; //raio (metade da diagonal) } parameters_CUBE; typedef struct ranges_CUBE_ { interval_t rot_x, rot_y, rot_z; //rotacoes em cada eixo interval_t scale; //raio (metade da diagonal) } ranges_CUBE; //parametros para o VOLVOX (exceto translações): typedef struct parameters_VOLVOX_ { double scale; //raio da esfera externa. int num_spheres; //numero de esferas internas. double tx[NUM_SPHERES],ty[NUM_SPHERES],scale_sphere[NUM_SPHERES]; //parametros das esferas internas } parameters_VOLVOX; typedef struct ranges_VOLVOX_ { interval_t scale; //raio da esfera externa. int num_spheres_max; //numero maximo de esferas internas. interval_t tx[NUM_SPHERES],ty[NUM_SPHERES],scale_sphere[NUM_SPHERES]; //parametros das esferas internas } ranges_VOLVOX; //parametros para o ELEGANS (exceto translações): typedef struct parameters_ELEGANS_ { double radius; //metade do comprimento. double height; //raio na cintura. double alpha; //curvatura total no plano XY. double beta; //curvatura diferencial no plano XY. } parameters_ELEGANS; typedef struct ranges_ELEGANS_ { interval_t radius; //metade do comprimento. interval_t height; //raio na cintura. interval_t alpha; //curvatura total no plano XY. interval_t beta; //curvatura diferencial no plano XY. } ranges_ELEGANS; //parametros para o PARAMECIUM (exceto translações): typedef struct parameters_PARAMECIUM_ { double length; //comprimento. double width; //largura. double height; //altura. double rot_x, rot_y, rot_z; //rotacoes em cada eixo. } parameters_PARAMECIUM; typedef struct ranges_PARAMECIUM_ { interval_t length; //comprimento. interval_t width; //largura. interval_t height; //altura. interval_t rot_x, rot_y, rot_z; //rotacoes em cada eixo. } ranges_PARAMECIUM; model *get_model(int model_num); void choose_initial_param_ranges(model *mod, int NX, int NY, interval_t range[]); void rotation_vector_2d(double x, double y, double r, double angle, double *xn, double *yn); void modification_vector_2d(double x, double y, double ini, double fim, double a, double b, double *xn, double *yn); void allocate_set_of_candidates(set_of_candidates *candidates, int num_candidates); void deallocate_set_of_candidates(set_of_candidates *candidates); int max(int a, int b, int c); void create_initial_set_of_candidates(set_of_candidates *candidates, int scale, int model, int num_variation); void create_images_of_candidates(set_of_candidates *candidates, float_image_t *image_in, int scale, int dim_img_in, int num_scale, int save); void create_candidate_image_sorting(set_of_candidates *best, candidate *c, int ind, float_image_t *image_in, int scale, int dim_img_in, int num_scale, int save); void copy_candidate(candidate *a, candidate *b); void swap_candidates(set_of_candidates * candidates, int index1, int index2); int id_lower(set_of_candidates *candidates); void print_parameters(set_of_candidates *candidates, int scale); void initialize_best_candidates(set_of_candidates *best); int insert_sorting(set_of_candidates *best, candidate *c); void sort_candidates(set_of_candidates *candidates); void calculate_range_steps_cube(candidate *c, int scale, int *num_var_trans, int *num_var_scale, int *num_var_rot); void calculate_range_steps_volvox(candidate *c, int scale, int *num_var_trans, int *num_var_scale, int *num_var_it, int *num_var_is); void calculate_range_steps_elegans(candidate *c, int scale, int *num_var_trans, int *num_var_radius, int *num_var_height, int *num_var_angle, int *num_var_rot); void fill_displacements_cube(displacements *d, candidate *c, int num_var_trans, int num_var_scale, int num_var_rot); void fill_displacements_volvox(displacements *d, candidate *c, int num_var_trans, int num_var_scale, int num_var_it, int num_var_is); void fill_displacements_elegans(displacements *d, candidate *c, int num_var_trans, int num_var_radius, int num_var_height, int num_var_angle); #endif // Last edited on 2011-01-19 15:45:00 by stolfilocal