//* Módulo : objeto.hpp // // _Descrição_ _. // Declara as classes *Objeto_3D*, *Esfera*, *Triangulo*, CaixaParalela. // Declara as classes *Plano*, *PlanoX*, *PlanoY*, PlanoZ. // _Autor_: Rodrigo P. R. de Toledo #ifndef __OBJ_HPP #define __OBJ_HPP #include #include "varios.hpp" #include "materiais.hpp" //* classe Objeto_3D #Objeto_3D# //* Esta classe é mãe das classes Esfera, CaixaParalela e Triângulo. class Objeto_3D { protected: int indice_textura; public: //* Construtor e Destrutor Objeto_3D( FILE * fp ); Objeto_3D(int _indice_textura) : indice_textura( _indice_textura ) {}; virtual ~Objeto_3D() {}; //* Funções puras virtuais para serem implementadas pelos herdeiros virtual double Intercepta( Raio r_vis ) = 0; virtual Vetor_3D Normal( Vetor_3D ponto ) = 0; //* Função que retorna qual é a textura int Indice_textura() { return indice_textura; }; virtual Cor_rgb Cor_difusa( Vetor_3D ponto, Material*mat ) { return mat->Cor_difusa(); }; }; //* classe Esfera #Esfera# class Esfera : public Objeto_3D { private: double raio; Vetor_3D centro; public: //* Construtor e Destrutor Esfera( FILE *fp ); Esfera( int _indice_textura, double _raio, Vetor_3D _centro ); ~Esfera() {}; //* interseção e Normal double Intercepta( Raio r_vis ); Vetor_3D Normal( Vetor_3D ponto ); Cor_rgb Cor_difusa( Vetor_3D ponto, Material*mat ); }; //* classe Triangulo #Triangulo# class Triangulo : public Objeto_3D { private: Vetor_3D vert1, vert2, vert3; Vetor_3D aresta12, aresta23, aresta31; Vetor_3D normal; void ComputaNormal(); public: //* Construtor e Destrutor Triangulo( FILE *fp ); Triangulo( int _indice_textura, Vetor_3D vertices[] ); ~Triangulo() {}; //* interseção e Normal double Intercepta( Raio r_vis ); Vetor_3D Normal( Vetor_3D ponto ); }; //* classe Plano #Plano# //* Define um plano. Esta classe é mãe das classes PlanoX, PlanoY e PlanoZ. class Plano { protected: double a, bmin, bmax, cmin, cmax; public: //* Construtor e Destrutor Plano( double _a, double _bmin, double _bmax, double _cmin, double _cmax ) : a(_a), bmin(_bmin), bmax(_bmax), cmin(_cmin), cmax(_cmax) {}; ~Plano() {}; //* interseção. Função pura virtual para ser implementada pelos herdeiros virtual double Intercepta( Raio r_vis ) = 0; }; //* classe PlanoX #PlanoX# //* Este plano é perpendicular ao eixo X class PlanoX : public Plano { public: //* Construtor e Destrutor PlanoX( double _x, double _ymin, double _ymax, double _zmin, double _zmax ) : Plano( _x, _ymin, _ymax, _zmin, _zmax ) {}; ~PlanoX() {}; //* interseção double Intercepta( Raio r_vis ); }; //* classe PlanoY #PlanoY# //* Este plano é perpendicular ao eixo Y class PlanoY : public Plano { public: //* Construtor e Destrutor PlanoY( double _y, double _xmin, double _xmax, double _zmin, double _zmax ) : Plano( _y, _xmin, _xmax, _zmin, _zmax ) {}; ~PlanoY() {}; //* interseção double Intercepta( Raio r_vis ); }; //* classe PlanoZ #PlanoZ# //* Este plano é perpendicular ao eixo Z class PlanoZ : public Plano { public: //* Construtor e Destrutor PlanoZ( double _z, double _xmin, double _xmax, double _ymin, double _ymax ) : Plano( _z, _xmin, _xmax, _ymin, _ymax ) {}; ~PlanoZ() {}; //* interseção double Intercepta( Raio r_vis ); }; //* classe CaixaParalela #CaixaParalela# //* A CaixaParalela tem 6 planos, contidos dois a dois nos planos:xy, xz, yz. class CaixaParalela : public Objeto_3D { private: Vetor_3D extremo_inferior, extremo_superior; //pontos que limitam a caixa PlanoX *px1, *px2; PlanoY *py1, *py2; PlanoZ *pz1, *pz2; void DefineFaces(); public: //* Construtor e Destrutor CaixaParalela( FILE *fp ); CaixaParalela( int _indice_textura, Vetor_3D _extremo_inferior, Vetor_3D _extremo_superior ); ~CaixaParalela(); //* interseção e Normal double Intercepta( Raio r_vis ); Vetor_3D Normal( Vetor_3D ponto ); }; #endif