Comment trouver les courbes de niveau pour l'algorithme de suppression des lignes cachées d'Appel

10

Pour le plaisir, j'essaie de créer une visionneuse filaire pour le DCPU-16 . Je comprends comment faire tout sauf comment cacher les lignes qui sont cachées dans le fil de fer. Toutes les questions ici sur SO supposent toutes que vous avez accès à OpenGL, malheureusement je n'ai pas accès à quelque chose comme ça pour le DCPU-16 (ou tout type d'accélération matérielle).

J'ai trouvé une assez bonne description de l'algorithme d'Appel sur Google Books . Cependant, il y a un problème que j'ai du mal à comprendre.

Appel a défini la ligne de contour comme un bord partagé par un polygone orienté vers l'avant et vers l'arrière, ou un bord non partagé d'un polygone orienté vers l'avant qui ne fait pas partie d'un polyèdre fermé. Une arête partagée par deux polygones orientés vers l'avant ne modifie pas la visibilité et n'est donc pas une ligne de contour. Sur la figure 8.4, les bords AB, EF, PC, GK et CH sont des lignes de contour, tandis que les bords ED, DC et GI ne le sont pas.

Fig. 8.4

Je comprends les règles de l'algorithme et son fonctionnement une fois que vous avez vos courbes de niveau, mais je ne comprends pas ce que je dois faire pour déterminer si une arête est " partagée par un polygone orienté vers l'avant et vers l'arrière, ou bord non partagé d'un polygone orienté vers l'avant qui ne fait pas partie d'un polyèdre fermé "du point de vue du codage. Je peux regarder une forme et je peux savoir quelles lignes sont des courbes de niveau dans ma tête, mais je n'ai aucune idée sur la façon de transférer cette "compréhension" dans un algorithme codé.


Mettre à jour

J'ai fait quelques progrès dans la détermination des courbes de niveau. J'ai trouvé ces deux notes de cours d'une classe de l'Université de Buffalo sur l'infographie.

entrez la description de l'image ici

Considérez les bords. Ceux-ci se répartissent en trois catégories.

  1. Un bord joignant deux faces invisibles est lui-même invisible. Cela sera supprimé de la liste et ignoré.
  2. Un bord joignant deux faces potentiellement visibles est appelé «bord de matériau» et nécessitera un traitement supplémentaire.
  3. Un bord joignant une face potentiellement visible et une face invisible est un cas particulier de «bord de matière» et est également appelé «bord de contour».

En utilisant les deux informations ci-dessus, je suis en mesure de me rapprocher de la possibilité d'écrire cela sous forme de code, mais j'ai encore un long chemin à parcourir.

Scott Chamberlain
la source
Méta-discussion sur cette question: Dois-je déplacer ma question sur math.stackexchange.com?
Gilles 'SO- arrête d'être méchant'
1
Vérifiez cette réponse sur le calcul de la normale du triangle. Le produit scalaire du vecteur normal avec le vecteur de ligne de visée détermine si un triangle est orienté vers l'avant.

Réponses:

3

Pour que la règle "-facing" soit maintenue, vous devez vous assurer que toutes les faces sont correctement orientées. Utilisez la règle de droite par exemple, cela signifie que les sommets d'une face doivent être numérotés de telle sorte qu'une rotation positive dans le plan de la face correspond à un pointage normal à l'extérieur du polyèdre. (Compris?) Ou plus simplement, chaque visage doit avoir sa normale orientée vers l'extérieur.

Les faces pendantes, c'est-à-dire n'appartenant pas à un polyèdre fermé, peuvent être considérées comme ayant une orientation indéterminée.

Maintenant, calculer les parties d'une arête qui sont cachées par un polygone de contour est le cours principal. Ce problème est très proche de celui de l'écrêtage d'un segment de ligne par une fenêtre polygonale en 2D. Considérez d'abord la ligne de support du segment de ligne et trouvez les intersections avec le polygone. En utilisant une règle de parité, vous pouvez facilement déterminer les pièces à l'intérieur et à l'extérieur du polygone.

Yves Daoust
la source