A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

C++ INF1761 - Computação Gráfica. Orientação por Objetos Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento.

Apresentações semelhantes


Apresentação em tema: "C++ INF1761 - Computação Gráfica. Orientação por Objetos Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento."— Transcrição da apresentação:

1 C++ INF Computação Gráfica

2 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

3 Classes em C++ typedef struct { double xc, yc; double raio; } Circulo; double area( Circulo e ) { return * e.raio * e.raio; } int interior( Circulo e, double x, double y) { … } X C struct Circulo{ double xc, yc; double raio; double area() { return * raio * raio; } int interior(double x, double y) { … } }; C++

4 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++

5 Encapsulamento struct Classe { private: int c, b; public: int a, d; void set_c( int val ) { c = val; } }; Classe obj; obj.a = 1; // ok obj.c = 0; // erro - campo c é privado obj.set_c( 0 ); // agora sim class Classe { int c, b; public: int a, d; void set_c( int val ) { c = val; } }; Declarações equivalentes class: default é private struct: default é public

6 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 } construtor funcao f destrutor Execução de f Métodos chamados implicitamente quando o objeto é criado e quando é destruído.

7 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ção Circulo c2; // erro, não tem construtor sem parâmetros c1.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.

8 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ória delete c1; // idem class Circulo{ … public: Circulo(); Circulo( double x, double y, double r); ~Circulo(); };

9 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

10 Representação dos objetos double xc double yc double raio Representação da classe Circulo Circulo double xc double yc double raio int cor Declarado em CirculoColorido Representação da classe Circulo CirculoColorido CirculoColorido* Circulo*

11 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)) …

12 Polimorfismo class 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 A A* obj_a = new A; // cria objeto da classe A B* obj_b = new B; // cria objeto da classe B pa = obj_a; // pa aponta para um objeto da classe A pa->nome(); // chama o metodo de A pa = obj_b; // pa aponta para um objeto da classe B pa->nome(); // chama o metodo de B!!!

13 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; } 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 objeto da cena precisa ter para permitir a implementação desta função?

14 Implementando a função trace Objeto3D* objetos[MAX_OBJETOS]; int n_objetos; Cor trace( Raio ray, int depth ) { int mais_proximo; double dist = -1; for (int i=0; iintersecta(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... rtColor trace ( rtRay ray, int depth) { determine a interseção mais próxima com um objeto...

15 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; }... if (intercepta objeto) { calcule a normal no ponto de interseção return ( shade ( object, ray, intersection, normal, depth); } return BACKGROUND; }

16 Referência de C++ The C++ Programming Language 3 a Edição B. Stroustrup Addison-Wesley, 1997


Carregar ppt "C++ INF1761 - Computação Gráfica. Orientação por Objetos Dados são modelados não apenas pela sua representação, mas principalmente pelo seu comportamento."

Apresentações semelhantes


Anúncios Google