Computação Gráfica
Exercício sobre
Cálculo de Interseção entre Objetos
Prof. Márcio Sarroglia Pinho

Detecção de Interseção X Cálculo de Interseção


Detecção de Intersecção
significa determinar, se existe ou não um ponto em comum entre dois segmentos de reta.

Cálculo de Intersecção significa determinar as coordenadas, através de equações ou de algum algoritmo iterativo, do ponto em comum entre dois segmentos de reta.

Tanto em um caso quanto em outro, é preciso antes de aplicar os algoritmos de intersecção, calcular quais as coordenadas dos extremos do segmento de reta após a aplicação das transformações geométricas. A obtenção destas coordenadas é apresentada a seguir.

Cálculo das Coordenadas de um Ponto

Quando você desenha objetos em OpenGL,  geralmente especifica as coordenadas destes objetos e, a partir de transformações geométricas (rotação, translação e escala), pode fazer o objeto mover-se na tela.

Depois de movido, o objeto assume novas coordenadas que são diferentes das coordenadas originais.

Para obter as novas coordenadas deste objeto (após as transformações geométricas) pode ser usada a função CalculaPonto apresentada a seguir.

Esta rotina deve ser chamada logo após o desenho da linha que contém o ponto do qual se deseja as coordenadas, cuidando para que a chamadas fiquem fora do bloco glBegin - glEnd.


typedef struct

    GLfloat x,y,z;
} Ponto;

// ***********************************************
//  void calcula_ponto(Ponto p, Ponto &out)
//
//  Esta função calcula as coordenadas
//  de um ponto no sistema de referência do
//  universo (SRU), ou seja, aplica as rotações,
//  escalas e translações a um ponto no sistema
//  de referência do objeto SRO.
// ***********************************************
void CalculaPonto(Ponto p, Ponto &out) {

    GLfloat ponto_novo[4];
    GLfloat matriz_gl[4][4];
    int  i;

    glGetFloatv(GL_MODELVIEW_MATRIX,&matriz_gl[0][0]);

    for(i=0; i<4; i++) {
        ponto_novo[i] = matriz_gl[0][i] * p.x +
                        matriz_gl[1][i] * p.y +
                        matriz_gl[2][i] * p.z +
                        matriz_gl[3][i];
    }
    out.x = ponto_novo[0];
    out.y = ponto_novo[1];
    out.z = ponto_novo[2];

}

A função Desenha, apresentada abaixo, exemplifica o uso da função
CalculaPonto.

// ***********************************************
//  void Desenha ()
// ***********************************************
void Desenha ()
{
     Ponto p1_new, p2_new;

     p1.x = 10;   p1.y = 10;   p1.z = 20;
     p1.x = 20;   p1.y = 10;   p1.z = 20;

     glRotate3f(10,0,0,1);
     glBegin(GL_LINES);
         //desenha a linha com as transformações geométricas
         glVertex3f(p1.x, p1.y, p1.z);
         glVertex3f(p2.x, p2.y, p2.z);

         // .......
     glEnd();

     // Aplica as transformações geométricas aos pontos da linha

     // As chamadas da função CalculaPonto devem ser feitas fora dos blocos glBegin-glEnd

     CalculaPonto(p1, p1_new);
     CalculaPonto(p2, p2_new);
     //imprime p1_new e p2_new

}
 


Exercício 1

Para a resolução dos exercícios desta aula utilize o projeto que está nesta página.

Abra o projeto exemploGLUT.cbp, remova o arquivo ProgramaBasicoOpenGL.cpp e adicione ao projeto os arquivos InterseccaoEntreLinhas.cpp, Linha.cpp e Ponto.cpp que estão neste ZIP. Cuide para descompactar também os arquivos Ponto.h e Linha.h no mesmo diretório em que colocar os .CPP.

Execute o programa e veja o resultado. Utilize as teclas de seta para mover uma linha na tela e as teclas 'R' e 'r'. 

Baseado no texto da página "Detecção de Colisão entre Segmentos de Reta", resolva os exercícios propostos no fonte InterseccaoEntreLinhas.cpp

Exercício 2

Baseado no texto da página "Cálculo do Ponto de Intersecção entre Segmentos de Reta", modifique seu programa de maneira que se possa imprimir as coordenadas do ponto de intersecção quando houver.