Como encontrar linhas de contorno para o algoritmo de remoção de linhas ocultas de Appel

10

Por diversão, estou tentando criar um visualizador de estrutura de arame para o DCPU-16 . Eu entendo como fazer tudo, exceto como ocultar as linhas que estão ocultas na estrutura de arame. Todas as perguntas aqui no SO supõem que você tenha acesso ao OpenGL, infelizmente não tenho acesso a nada parecido com o DCPU-16 (ou qualquer tipo de aceleração de hardware).

Encontrei uma descrição bastante boa do algoritmo de Appel no Google Livros . No entanto, há um problema que estou tendo problemas para descobrir.

Appel definiu a linha de contorno como uma aresta compartilhada por um polígono voltado para a frente e voltado para trás ou aresta não compartilhada de um polígono voltado para a frente que não faz parte de um poliedro fechado. Uma aresta compartilhada por dois polígonos voltados para a frente não causa alteração na visibilidade e, portanto, não é uma linha de contorno. Na Fig. 8.4, as arestas AB, EF, PC, GK e CH são linhas de contorno, enquanto as arestas ED, DC e GI não.

Fig. 8.4

Entendo as regras do algoritmo e como ele funciona quando você tem suas linhas de contorno, no entanto, não entendo o que preciso fazer para determinar se uma aresta é " compartilhada por um polígono voltado para a frente e voltado para trás ou borda não compartilhada de um polígono voltado para a frente que não faz parte de um poliedro fechado "do ponto de vista da codificação. Posso observar uma forma e saber quais linhas são linhas de contorno na minha cabeça, mas não tenho idéia de como transferir esse "entendimento" para um algoritmo codificado.


Atualizar

Eu fiz alguns progressos na determinação das linhas de contorno. Encontrei essas duas notas de aula de uma aula da Universidade de Buffalo sobre computação gráfica.

insira a descrição da imagem aqui

Considere as arestas. Estes caem em três categorias.

  1. Uma aresta que une duas faces invisíveis é ela própria invisível. Isso será excluído da lista e ignorado.
  2. Uma aresta que une duas faces potencialmente visíveis é chamada de 'aresta do material' e exigirá processamento adicional.
  3. Uma aresta que une uma face potencialmente visível a uma face invisível é um caso especial de uma 'aresta material' e também é chamada de 'aresta de contorno'.

Usando as duas informações acima, sou capaz de escrever isso como código, mas ainda tenho um longo caminho a percorrer.

Scott Chamberlain
fonte
Meta discussão sobre esta pergunta: Devo mudar minha pergunta para math.stackexchange.com?
Gilles 'SO- stop be evil'
11
Verifique esta resposta no cálculo do triângulo normal. O produto pontilhado do vetor normal com vetor de linha de visão determina se um triângulo está virado para a frente.

Respostas:

3

Para que a regra "-facing" seja mantida, verifique se todas as faces estão orientadas corretamente. Use a regra da mão direita, por exemplo, que significa que os vértices de uma face devem ser numerados de forma que uma rotação positiva no plano da face corresponda a um apontamento normal fora do poliedro. (Entendeu?) Ou, mais simplesmente, todo rosto deve vir com o normal de apontar para fora.

As faces oscilantes, isto é, não pertencentes a um poliedro fechado, podem ser vistas como tendo uma orientação indeterminada.

Agora, calcular as partes de uma aresta que estão ocultas por um polígono de contorno é o prato principal. Esse problema está muito próximo ao de recortar um segmento de linha por uma janela poligonal em 2D. Primeiro, considere a linha de suporte do segmento de linha e encontre interseções com o polígono. Usando uma regra de paridade, você pode determinar facilmente as partes dentro e fora do polígono.

Yves Daoust
fonte