Por diversión, estoy tratando de hacer un visor de marco de alambre para DCPU-16 . Entiendo cómo hacer todo, excepto cómo ocultar las líneas que están ocultas en el marco de alambre. Todas las preguntas aquí en SO suponen que tiene acceso a OpenGL, desafortunadamente no tengo acceso a nada de eso para el DCPU-16 (o cualquier tipo de aceleración de hardware).
Encontré una descripción bastante buena del algoritmo de Appel en Google Books . Sin embargo, hay un problema que estoy teniendo problemas para resolver.
Appel definió la línea de contorno como un borde compartido por un polígono orientado hacia adelante y hacia atrás, o un borde no compartido de un polígono orientado hacia adelante que no es parte de un poliedro cerrado. Un borde compartido por dos polígonos frontales no causa cambios en la visibilidad y, por lo tanto, no es una línea de contorno. En la figura 8.4, los bordes AB, EF, PC, GK y CH son líneas de contorno, mientras que los bordes ED, DC y GI no lo son.
Entiendo las reglas del algoritmo y cómo funciona una vez que tenga sus líneas de contorno, sin embargo, no entiendo qué es lo que debo hacer para determinar si un borde es " compartido por un polígono orientado hacia adelante y hacia atrás, o borde no compartido de un polígono de frente que no es parte de un poliedro cerrado "desde un punto de vista de codificación. Puedo ver una forma y puedo saber qué líneas son curvas de nivel en mi cabeza, pero no tengo idea de cómo transferir esa "comprensión" a un algoritmo codificado.
Actualizar
He avanzado en la determinación de las líneas de contorno. Encontré estas dos notas de una clase de la Universidad de Buffalo sobre gráficos por computadora.
Considera los bordes. Estos se dividen en tres categorías.
- Un borde que une dos caras invisibles es en sí mismo invisible. Esto se eliminará de la lista y se ignorará.
- Un borde que une dos caras potencialmente visibles se llama 'borde de material' y requerirá un procesamiento adicional.
- Un borde que une una cara potencialmente visible y una cara invisible es un caso especial de un 'borde material' y también se llama 'borde de contorno'.
Utilizando los dos datos anteriores, puedo acercarme a poder escribir esto como código, pero todavía tengo un largo camino por recorrer.
fuente
Respuestas:
Para que se cumpla la regla de "cara", debe asegurarse de que todas las caras estén orientadas correctamente. Use la regla de la mano derecha, por ejemplo, eso significa que los vértices de una cara deben numerarse de tal manera que una rotación positiva en el plano de la cara corresponda a un apunte normal fuera del poliedro. (¿Entendido?) O más simplemente, cada cara debe venir con su normalidad hacia afuera.
Se puede ver que las caras colgantes, es decir, que no pertenecen a un poliedro cerrado, tienen una orientación indeterminada.
Ahora calcular las partes de un borde que están ocultas por un polígono de contorno es el curso principal. Este problema es muy similar al de recortar un segmento de línea por una ventana poligonal en 2D. Primero considere la línea de soporte del segmento de línea y encuentre intersecciones con el polígono. Al usar una regla de paridad, puede determinar fácilmente las partes dentro y fuera del polígono.
fuente