Cálculo de Interseção entre Objetos



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 calcular antes de aplicar os algoritmos de intersecção, 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 calcula_ponto apresentada a seguir. Esta rotina deve ser chamada logo após o desenho da linha que cont;em o ponto do qual se deseja as coordenadas.

#include <windows.h>
#include <gl\gl.h>

typedef struct
{
 GLfloat x,y,z;
} Ponto3D;

// ***********************************************
//  void calcula_ponto(Ponto3D *p, Ponto3D *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 calcula_ponto(Ponto3D *p, Ponto3D *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];
}
 

Ponto3D p1, p2;

// ***********************************************
//  void Desenha ()
//    
//
// ***********************************************
void Desenha ()
{
     Ponto3D 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
         glVertex3f(p1.x, p1.y, p1.z);
         glVertex3f(p2.x, p2.y, p2.z);
         // aplica as transformações geométricas
         // aos pontos da linha
         calcula_ponto(&p1, &p1_new);
         calcula_ponto(&p2, &p2_new);
         //imprime p1_new e p2_new
         // .......
     glEnd();
}
 



Detecção de Colisão entre Segmentos de Reta


Cálculo do Ponto de Intersecção entre Segmentos de Reta


Cálculo de Interseção entre triângulos