L'algorithme commence par un chemin que vous avez trouvé précédemment, dans ce cas une liste de triangles:
Le code au bas du billet de blog de Mikko construit le tableau des portails, qui est une liste de segments de ligne représentant les segments de ligne entre les polygones du chemin. Ce sont les «portails» que le chemin lissé doit traverser (ou les bords du polygone à partir de «traçons les points médians du bord du polygone»). Notez que la liste des portails commence et se termine par des segments de ligne dégénérés aux points de départ et d'arrivée.
Cette liste de portails est représentée par les segments de la ligne pointillée jaune dans ses images.
L'algorithme commence par un large entonnoir et procède par déplacement itératif des côtés de l'entonnoir vers l'avant le long des points latéraux du portail (les points d'extrémité des segments de ligne) tant que cela resserre l'entonnoir (AD).
Cela signifie que chaque mouvement vers l'avant doit déplacer les bords de l'entonnoir vers l'intérieur, cela peut être vérifié avec le produit croisé des vecteurs représentant l'ancien côté et le nouveau côté potentiel ( P × Q dans l'image ci-dessous; voir également triarea2
dans le code de Mikko). Si un pas en avant pour un côté ne resserre pas l'entonnoir, nous ne mettons pas à jour ce côté pour l'itération actuelle des portails (E).
L'autre cas qui doit être traité est lorsque l'entonnoir dégénère en un segment de ligne. Pour tenir compte de cela, l'algorithme vérifie si l'un des côtés est du "mauvais" côté en utilisant à nouveau le produit croisé, cette fois des vecteurs faits respectivement par le sommet de l'entonnoir et les extrémités des côtés droit et gauche ( R × S dans l'image ci-dessous).
Si tel est le cas, le vecteur de l'apex de l'entonnoir et le point d'extrémité latéral correct sont ajoutés au chemin lissé ( R dans l'image ci-dessus) et l'algorithme est redémarré avec son point d'extrémité comme nouveau sommet (FG), sauf si, bien sûr, si c'est le but.