#ifndef RAY_H #define RAY_H ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #include #include ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// #define X 1 #define Y 2 #define CHANELL 0 #define RGB 3 #define R 0 #define G 1 #define B 2 #define NUM_SCALE 10 #define EPS 1E-5 #define MAX_DOUBLE 99E+20 #define BODY 0 #define UP 1 #define DOWN 2 #define SPHERE 0 //constante que identifica uma bola #define CUBE 1 //constante que identifica um cubo #define CILINDER 2 //constante que identifica um cilindro #define BEZIER 3 //constante que identifica um retalho de bezier #define NUM_POINTS 10 #define NUM_CONTROL_POINTS 16 #define DIM_GRID 4 ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// //estrutura criada para armazenar colores no formato R,G,B typedef struct color_ { double r,g,b; //color segundo o padrao rgb } color; //estrutura criada para armazenar colores no formato R,G,B typedef struct g_color_ { double g; //color segundo o padrao rgb } g_color; //estrutura utilizada para armazenar informaçoes relativas a surface typedef struct surface_ { color transp;//transparencye color dif;//difusa color espec;//espec color amb;//ambiente } surface; //estrutura utilizada para armazenar as coordenadas de um vetor 3d typedef struct vector_3d_ { double x,y,z; //coordenadas do vetor } vector_3d; //estrutura utilizada para armazenar as coordenadas de um ponto no R^3 typedef struct point_3d_ { double x,y,z; //coordenadas do vetor } point_3d; //estrutura que armazena as informacoes de um pixel do filme fotografico typedef struct pixel_ { point_3d center; g_color color; } pixel; //estrutura que represnta a pelicula de um filme fotografico typedef struct filme_ { double x,y,z; double dist; int n_l,n_c; double dim_cell; pixel *pixel; } filme; //estrutura que representa a luz da cena typedef struct light_ { point_3d position; double intensity; } light; //estrutura utilizada para armazenar os dados da bola typedef struct sphere_ { double x,y,z, //coordenadas do centro da bola radius; //raio da bola surface surface;//color da bola double rot_x, rot_y, rot_z; //rotacao da esfera double matrix[4*4]; //matriz de transformação double inv[4*4]; //matriz de transformação } sphere; //estrutura utilizada para armazenar as informações do cubo typedef struct cube_ { double x,y,z; //centro do cubo double d; //dimensoes das faces int li; //lado interceptado surface surface; double rot_x, rot_y, rot_z; //rotacao do cubo double matrix[4*4]; //matriz de transformação double inv[4*4]; //matriz de transformação } cube; //estrutura utilizada para armazenar as informações do cubo typedef struct cilinder_ { double x,y,z; //centro do cilindro double radius; //raio do cilindro int li; //lado interceptado double height; //altura do cilindro surface surface; double rot_x, rot_y, rot_z;//rotacao do cilindro double matrix[4*4]; //matriz de transformação double inv[4*4]; //matriz de transformação } cilinder; //struct que armazena os pontos de controle do retalho de bezier typedef struct bezier_patch_ { point_3d control_points[NUM_CONTROL_POINTS]; //pontos de controle } bezier_patch; //estrutura utilizada para armzenar as caixas envoltorias typedef struct bounding_box_ { point_3d lim_min, lim_max;//os dois pontos definem o bounding box } bounding_box; //estrutura utilizada para armazenar informações relativa ao bezier patch typedef struct bezier_ { bezier_patch bezier; //retalho de bezier double scale; //escala surface surface; //superficie do retalho double matrix[4*4]; //matriz de transformação double inv[4*4]; //matriz de transformação double rot_x, rot_y, rot_z; //rotacao do retalho } bezier; //estrutura utilizada para armazenar as informações do cubo typedef struct scene_ { point_3d observer; //posicao do observador point_3d look_at; //posicao de observacao point_3d sky; //aponta para o ceu int num_objects; //numero de objetos da cena int num_cilinders; //numero de cilindros int num_spheres; //numero de esferas int num_cubes; //numero de cubos int num_beziers;//numero de retalhos de bezier int num_lights; //numero de luzes light *l; //luzes da cena cube *cubes; //cubos da cena sphere *spheres; //esfera da cena cilinder *cilinders; //cilindros da cena bezier *beziers;//retalhos de bezier da cena } scene; //estrutura utilizada para armazenar os pontos de intersecção de //modo aq facilitar o calculo da transparencia typedef struct intersection_points_ { int type[NUM_POINTS]; //tipo dos objetos interceptados int index[NUM_POINTS]; //indice de cada objeto point_3d points[NUM_POINTS]; //pontos interceptados double parametric[NUM_POINTS]; //fator parametrico color c[NUM_POINTS]; //cor de cada um dos pontos vector_3d normal[NUM_POINTS]; //normal dos pontos int qtd; //quantidade de pontos } intersection_points; typedef struct elegans_model_ { point_3d center; //centro do elegans double d; //tamanho da dimensao linear da bacteria double alpha,beta; //angulos de inclinacoes das particoes double diameter; //diametro do cilindro que representa a elegans } elegans_model; ////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////// double min(double a, double b, double c); void reverse_vector(vector_3d *v); double distance_betwen_points(point_3d p1, point_3d p2); void cross_product(vector_3d a, vector_3d b, vector_3d *c); double scalar(vector_3d a, vector_3d b); void ortogonal_projection(vector_3d line, vector_3d vector, vector_3d *ortogonal); void normalize_vector(vector_3d *vector); double intersection_vector_sphere(point_3d origin, vector_3d ray, sphere *sphere, color *c, vector_3d *normal); void normal_sphere(sphere sphere, point_3d intersection, vector_3d *normal); double intersection_vector_cube(point_3d observer, vector_3d ray, cube *cube, color *color, vector_3d *normal); void normal_cube(cube cube, point_3d intersection, vector_3d *normal); double intersection_vector_cilinder(point_3d observer, vector_3d ray, cilinder *cilinder, color *color, vector_3d *normal); void normal_cilinder(cilinder cilinder, point_3d intersection, vector_3d *normal); double * vector_3d_to_vector(vector_3d vec); void vector_to_vector_3d(double *vector, vector_3d *vec); double * point_3d_to_vector(point_3d point); void vector_to_point_3d(double *vector, point_3d *point); void swap_intersection_points(intersection_points *i_points, int index1, int index2); void sort_points_intersection(intersection_points *i_points); void inicialiaze_points_intersection(intersection_points *i_points); void scene_intersection(scene *scene, point_3d origin, vector_3d ray, color *colors, int *index, int *type, vector_3d *normal, intersection_points *i_points); point_3d point_parametric(point_3d observer, vector_3d ray, double s); void normal_intersection(scene scene, point_3d intersection, int index, int type, vector_3d *normal); void transparency_intersection(scene *scene, point_3d intersection, int index, int type, color *color); void difuse_intersection(scene *scene, point_3d intersection, int index, int type, color *color); void specular_intersection(scene *scene, point_3d intersection, int index, int type, color *color); void allocate_filme(filme *pelicula, int x, int y, double tc, double d); void deallocate_filme(filme *pelicula); void allocate_scene_objects(scene *scene, int num_spheres, int num_cubes, int num_cilinders, int num_beziers); void allocate_scene_light(scene *scene, int num_lights); void deallocate_scene(scene *scene); float_image_t *filme_to_image(filme *pelicula); void correct_gamma(float_image_t *a,double gamma); color shading(scene *scene, point_3d observer, vector_3d ray, intersection_points *i_points, int index_light); void matrix_transformation(scene *scene, int type, int index); void ray_tracing(scene *scene, float_image_t *img, filme *pelicula, int num_rays); void create_image(scene *scene, filme *pelicula, float_image_t *image); float_image_t *create_mask(float_image_t *image); void execute_povray(char *model_name, int id_candidate, int scale, int dim_img_in); void linear_interpolation(point_3d *interpolated, point_3d origin, point_3d destin, double t); void points_to_subdivision(bezier_patch *sub1, bezier_patch *sub2, int line, point_3d p1, point_3d p2, point_3d p3, point_3d c, point_3d p4, point_3d p5, point_3d p6); void bezier_patch_subdivision(bezier_patch *sub1, bezier_patch *sub2, bezier_patch patch, int dir); void calculate_bounding_box(bounding_box *box, bezier_patch bezier); int intersection_matching_box(point_3d origin, vector_3d ray, point_3d lim_min, point_3d lim_max, double *min, double *max); void copy_bezier_patch(bezier_patch b, bezier_patch *b_copy); int bezier_patch_intersection(bezier_patch bezier, point_3d origin, vector_3d ray, point_3d *intersection, vector_3d *normal, double *tmin, int dir); #endif