Je pense que le formalisme de «l'algèbre de bord» de Guibas et Stolfi est un peu inutile.
Tout ce qui est vraiment nécessaire, c'est de se rappeler la distinction entre les graphes primitifs et doubles. Chaque face du graphe primitif a un sommet double correspondant f ∗ ; chaque bord e du graphe primitif a un double bord correspondant e ∗ ; et chaque sommet v du graphe primitif a une double face correspondante v ∗ . Les bords primaires relient les sommets primaires et les faces primaires séparées; les arêtes doubles connectent les sommets doubles et les faces doubles séparées. Le dual du dual de n'importe quoi est l'original. Voir la figure 4 dans l'article de Guibas et Stolfi:ff∗ee∗vv∗
Guibas et Stolfi proposent de penser chaque bord (primal ou dual) comme un ensemble de quatre bords dirigés et orientés ; pour plus de simplicité, je vais appeler ces fléchettes . Chaque fléchette pointe d'une queue d' extrémité ( → e ) vers l'autre tête d' extrémité ( → e ) et sépare localement deux faces gauche ( → e ) et droite ( → e ) . Le choix du point de terminaison à appeler la queue ( → e ) est celui de la fléchettee⃗ tail(e⃗ )head(e⃗ )left(e⃗ )right(e⃗ )tail(e⃗ )direction , et le choix de la face à appeler à est son orientation . (Guibas et Stolfi utilisent "Org" et "Dest" au lieu de "queue" et "tête", mais je préfère les étiquettes plus courtes, car les abréviations inutiles sont mauvaises.)left(e⃗ )
Pour toute fléchette , Guibas et Stolfi associent trois fléchettes liées:e⃗
- : La fléchette quittant la queue ( → e ) suivante dans le sens antihoraire après → e .tailNext(e⃗ )tail(e⃗ )e⃗
- flip(e⃗ )e⃗ left(e⃗ )right(e⃗ )
- rotate(e⃗ )e⃗
Ces trois fonctions satisfont toutes sortes d'identités merveilleuses, comme les suivantes:
- right(tailNext(e⃗ ))=left(e⃗ )
- right(flip(e⃗ ))=left(e⃗ )
- right(rotate(e⃗ ))=head(e⃗ )∗
- flip ( flip ( e⃗ ) ) = e⃗
- rotation ( rotation ( rotation ( rotation ( e⃗ ) ) ) ) = e⃗
- tailNext ( rotation ( tailNext ( rotation ( e⃗ ) ) ) ) = e⃗
e F l i pe.Flip
De plus, étant donné ces trois fonctions, on peut définir plusieurs autres fonctions utiles comme
- inverse ( e⃗ ) = rotation ( flip ( rotation ( e⃗ ) ) )
- leftNext ( e⃗ )=rotate(tailNext(rotate(rotate(rotate(e⃗ )))))e⃗ left(e⃗ )
Enfin, connaître ces fonctions vous dit absolument tout sur la topologie de la subdivision, et toute subdivision polygonale de n'importe quelle surface (orientable ou non) peut être encodée à l'aide de ces trois fonctions.
La structure de données à quatre bords est une représentation particulièrement pratique d'un graphique de surface qui donne accès à toutes ces fonctions, ainsi qu'à plusieurs autres opérations à temps constant comme l'insertion, la suppression, la contraction, l'expansion et le retournement des bords; fractionner ou fusionner des sommets ou des faces; et ajouter ou supprimer des poignées ou des chapeaux croisés.
S'amuser!