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.