Download - C++
![Page 1: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/1.jpg)
C++
INF1761 - Computação Gráfica
![Page 2: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/2.jpg)
Orientação por Objetos
• Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento
• Objetos são um TAD: representação interna + conjunto de operações
• Variáveis da aplicação são objetos• Classes são os tipos dos objetos• Funções dos objetos são chamadas métodos
![Page 3: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/3.jpg)
Classes em C++typedef struct { double xc, yc; double raio;} Circulo;
double area( Circulo e ){ return 3.14159 * e.raio * e.raio; }int interior( Circulo e, double x, double y) { … }
X
C
struct Circulo{ double xc, yc; double raio; double area() { return 3.14159 * raio * raio; } int interior(double x, double y) { … }};
C++
![Page 4: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/4.jpg)
Objetos em C++
Circulo c;c.x = 3.2;c.y = 4.5;c.raio = 6.5;printf(“%d”, area( c ));if (interior( c, 9.5, 2 )) …
Circulo c;c.x = 3.2;c.y = 4.5;c.raio = 6.5;printf(“%d”, c.area());if (c.interior( 9.5, 2 )) …
C
C++
![Page 5: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/5.jpg)
Encapsulamento
struct Classe { private: int c, b; public: int a, d; void set_c( int val ) { c = val; }};
Classe obj;obj.a = 1; // okobj.c = 0; // erro - campo c é privadoobj.set_c( 0 ); // agora sim
class Classe { int c, b; public: int a, d; void set_c( int val ) { c = val; }};
Declarações equivalentesclass: default é privatestruct: default é public
![Page 6: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/6.jpg)
Construtores e Destrutores
class Classe{ public: Classe() { printf(“construtor\n”); } ~Classe() { printf(“destrutor\n”); }};
void f(){ Classe p1, p2; // p1 e p2 criados printf( “funcao f\n” ); // p1 e p2 destruídos}
construtorconstrutorfuncao fdestrutordestrutor
Execução de f
Métodos chamados implicitamente quando o objeto é criado e quando é destruído.
![Page 7: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/7.jpg)
Construtores com parâmetros
class Circulo{ double xc, yc; double raio; public: Circulo( double x, double y, double r) { xc=x; yc=y; raio=r;} …};
Circulo c1( 3.2, 4.5, 9.0 ); // obriga a inicializaçãoCirculo c2; // erro, não tem construtor sem parâmetrosc1.xc = 4; // erro, campo xc é privado
Construtores podem ter parâmetros (destrutores não!). Além disso, uma classe pode ter mais de um construtor, desde que eles recebam parâmetros diferentes.
![Page 8: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/8.jpg)
Alocação dinâmica
Circulo *c1, *c2;c1 = new Circulo; // cria um objeto da classe Circulo, // alocando memória e chamando o // construtor Circulo()c2 = new Circulo( 3.2, 4.5, 9.0 ); // cria outro, // agora com o outro construtor…delete c2; // destroi o objeto apontado por c2: // chama o destrutor e desaloca memóriadelete c1; // idem
class Circulo{ … public: Circulo(); Circulo( double x, double y, double r); ~Circulo();};
![Page 9: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/9.jpg)
Herança
class CirculoColorido : public Circulo { int cor; public: CirculoColorido( double x, double y, double r, int c) : Circulo( x, y, r ) { cor = c; }
void troca_cor( int c ) { cor = c; }};
CirculoColorido c( 1.0, 3.4, 3.2, VERDE );c.troca_cor( AZUL );double a = c.area(); // ok, CirculoColorido tem tudo de Circulo
Herda da classe Circulo (classe base)
Inicializa a classe base antes de entrar no construtor
![Page 10: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/10.jpg)
Representação dos objetos
double xcdouble ycdouble raio
Representação da classe Circulo
Circulo
double xcdouble ycdouble raio
int cor Declarado em CirculoColorido
Representação da classe Circulo
CirculoColoridoCirculoColorido*
Circulo*
![Page 11: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/11.jpg)
Conversão de objetos
int intersecta( Circulo *c1, Circulo *c2 );
Circulo *c1, *c2;c1 = new Circulo(3, 4, 2);c2 = new Circulo(3.5, 3.3, 1 );
if (intersecta(c1, c2)) …
CirculoColorido *c3;c3 = new CirculoColorido( 2.5, 1, 3 );
if (intersecta(c1, c3)) …
![Page 12: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/12.jpg)
Polimorfismoclass A { virtual void nome() { printf(“classe A\n”); }};class B : public A { virtual void nome() { printf(“classe B\n”); }};
A *pa; // ponteiros para objetos da classe AA* obj_a = new A; // cria objeto da classe AB* obj_b = new B; // cria objeto da classe B
pa = obj_a; // pa aponta para um objeto da classe Apa->nome(); // chama o metodo <nome> de A
pa = obj_b; // pa aponta para um objeto da classe Bpa->nome(); // chama o metodo <nome> de B!!!
![Page 13: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/13.jpg)
Abstraindo as implementações dos objetos
class Objeto3D { public: virtual double intersecta( Raio r ) = 0; virtual Vetor3D normal( Vetor3D ponto ) = 0;};
rtColor trace ( rtRay ray, int depth){ determine a interseção mais próxima com um objeto if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( object, ray, intersection, normal, depth); } return BACKGROUND;}
Que métodos um objetoda cena precisa ter para
permitir a implementaçãodesta função?
![Page 14: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/14.jpg)
Implementando a função traceObjeto3D* objetos[MAX_OBJETOS];int n_objetos;
Cor trace( Raio ray, int depth ){ int mais_proximo; double dist = -1; for (int i=0; i<n_objetos; i++) { double d = objetos[i]->intersecta(ray); if (d > 0 && (dist==-1 || d < dist)) { dist = d; mais_proximo = i; } } ...
rtColor trace ( rtRay ray, int depth){ determine a interseção mais próxima com um objeto ...
![Page 15: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/15.jpg)
Implementando a função trace ... if (dist > 0) { Vetor3D ponto_de_inter = ray.ponto( dist ); Vetor3D normal = objetos[mais_proximo]->normal( ponto_de_inter); return shade(objetos[mais_proximo], ray, ponto, normal, depth ); } else { return BACKGROUND; }} ...
if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( object, ray, intersection, normal, depth); } return BACKGROUND;}
![Page 16: C++](https://reader038.vdocuments.pub/reader038/viewer/2022100509/56813098550346895d96760b/html5/thumbnails/16.jpg)
Referência de C++
The C++ Programming Language3a EdiçãoB. StroustrupAddison-Wesley, 1997