INF01009 - Trabalho Complementar  Nº 3

Definição:

    Data de Divulgação: 24/03/2008 
    Data para Entrega  : 31/03/2008

Dada a representação de dois points em coordenadas homogêneas P1 = (x1, y1, 1) e P2 = (x2, y2, 1), a equação da reta que passa por P1 e P2 pode ser encontrada calculando-se o produto vetorial P1 x P2. Por sua vez, dadas duas retas no plano, expressas pelas equações cujos coeficientes (ax + by + c = 0) são R1 = (a1, b1, c1) e R2 = (a2, b2, c2), o ponto de intersecção entre elas pode ser obtido por meio do  produto vetorial R1 x R2, seguido pela divisão por w (coordenada homogênea).  Estes resultados decorrem da dualidade entre reta e  ponto no espaço projetivo.

Neste trabalho, você implementará um programa para visualizar estes resultados, visando desenvolver intuição/interpretação geométrica para estes resultados. Como o produto vetorial de dois vetores linearmente independentes produz um vetor perpendicular a estes (i.e., vetor normal ao plano definido pelos dois vetores originais), visualize e interprete os resultados acima tanto no espaço vetorial R3, bem como no plano projetivo. De posse do seu visualizador, remova a restrição de que w = 1 para P1 e P2 (pontos que determinam R1) e para P3 e P4 (pontos que determinam R2). Explique o que está acontecendo.

Relatório:

    Bom, em suma, o 3º trabalho complementar consiste em um visualizador 3D do espaço projetivo. Para entender melhor isso, seria interessante um resumo do que é o plano projetivo.

    O plano projetivo é resultante do uso de coordenadas homogêneas. As coordenadas homogêneas foram idealizadas para que a matriz de transformação de vértices fosse quadrada, o que permitiria achar a sua inversa, tornando assim o trabalho de um redo ou um undo muito mais fácil de se implementar. As coordenadas homogêneas consistem em adicionar mais uma dimensão na definição das coordenadas dos vértices. Convencionou-se atribuir como valor para a coordenada extra, o valor 1. Pode-se ver nas imagens abaixo isso ilustrado:

Coordenadas 2D normaisCoordenadas 2D homogêneas 

    Porém ao se colocar uma dimensão a mais, ganhou-se mais do que apenas uma matriz quadrada. Entre os vários ganhos, podemos denotar as operações sobre retas e vértices em alguns exemplos. Se considerarmos os vértices com suas 3 coordenadas como vetores e fizermos um cross product(produto vetorial) entre dois vértices, obtemos um resultado bem interessante. Por exemplo, baseado nas figuras, se considerarmos os vetores V1 e V3, fazendo V1xV3 = <a, b, c>. Este vetor <a, b, c>, embora ainda meio nebuloso de se enxergar, é o vetor normal do plano formado pelos vetores V1 e V3. Tá, e para que serve isso? Eis a mágica: se considerarmos a reta entre os V1 e V3 pela equação ax + by + c = 0, advinhem quem são estes a, b e c? Exatamente, são as componentes do vetor normal! \o/
    Antes de dizer o porquê disso, vamos a mais uma propriedade interessante. Se considerarmos V1xV3 como o vetor R1 e V2xV4 como o vetor R2, lembrando que R1 e R2 definem as retas entre V1|V3 e V2|V4, se fizermos R1xR2 = (cx, cy, cz). Dividindo todos os elementos por cz, temos Cx = cx/cz e Cy = cy/cz, e com isso, temos como resultante o vetor <Cx, Cy, 1>. Mais nebulosamente ainda, este vetor, se considerado como um ponto em coordenadas homogêneas, é o ponto de interseção entre as retas R1 e R2. Legal, não?

Retas e Ponto de Interseção entre retas definidos como vetores e produtos vetorias.

    Tá, mas e por que diabos isso acontece? Eis que entra o visualizador 3D do espaço projetivo ;). Pensemos assim: Se considerarmos a 3ª coordenada que adicionamos como a distância que o plano está da origem, podemos então imaginar que existem infinitos planos 2D e que o 3D, nesse caso, é composto por uma sobreposição de todos estes planos, como se fossem "fatias". Pois bem, considerando o plano 1, um ponto neste plano, definido como <x, y, 1>, pode ser considerado como a interseção do vetor <x, y> que corta o plano 1. Pensando assim, podemos dizer que todos os vetores <x*p, y*p, p> podem ser considerados projetivamente equivalentes, ou seja, todos são definidos pelo mesmo vetor que sai da origem e cruza todos os planos.
    Sendo assim, se tomarmos V1 e V3 como dois vetores que saem da origem e cruzam o plano 1, podemos dizer que, se eles são linearmente independentes, existe um plano que contém tanto V1 quanto V2. Este plano é definido pela sua normal, que é, neste caso, V1xV3. Logo, se considerarmos apenas o plano 1, a única parte deste plano V1xV3 que se enxerga é a interseção entre o plano 1 e o plano V1xV3,    que é uma reta. Ou seja, a reta que liga a interseção de V1 e a interseção de V3 no plano 1 é uma parte do plano V1xV3, porém apenas enxergado no plano 1.
    Agora, sabendo que R1 e R2, descritos anteriormente, são os vetores normais dos planos formados por V1|V3 e V2|V4, respectivamente, e que cada um deles define, no plano 1, a reta entre seus vértices, o que é R1xR2? Considerando os dois como vetores, R1xR2 é o vetor normal entre os planos R1 e R2. E porquê isso define o ponto de interseção entre as duas retas? O vetor normal entre os dois planos define quais pontos pertencem tanto a R1 quanto a R2, ao mesmo tempo. Descendo um nível de abstração, temos o ponto entre as duas retas, em um plano qualquer.   
   
    Óbvio que explicando assim fica muito difícil de enxergar, por isso o visualizador 3D é importante.

    Ok, com isso, podemos passar para a parte do visualizador 3D. Ele foi feito utilizando a Glut, em C++ e o executável, junto com as dlls necessárias, pode ser pego aqui.
    A dinâmica de construção do visualizador foi bem simples: Criar planos, vetores, retas e pontos de forma a mostrar para o usuário como se comporta o espaço projetivo. Para isso, foram utilizadas primitivas básicas do OpenGL para a criação de poligonos e retas. Também foi utilizada uma função de Blend para deixar os planos com alguma transparência e assim melhorar a visualização.
    No visualizador existem alguns pontos principais. Primeiro, dois vetores principais (vetores amarelos e azul) , que são simétricos. A posição deles pode ser modificada pelo usuário. É mostrado também um plano semi-transparente (azul claro) que é formado pelos vetores principais. Segundo, existem 2 planos semi-transparentes equivalentes aos planos z(vermelho escuro) e z/2(azul escuro) do plano projetivo. Este z pode ser alterado (ver teclas de interação abaixo). Estes planos também mostram onde os vetores principais os cortam. E, por fim, podem ser observados dois vetores auxiliares (verde e vermelho), que criam um plano que intersecta o plano dos vetores principais (amarelo).

    Para interação, foi mantida a função de interação com mouse do primeiro trabalho complementar e adicionadas as seguintes funções:

    Abaixo, algumas imagens dos resultados obtidos:








 






 

Voltar para  Trabalhos Complementares