C'est une très bonne question. J'ai implémenté le même algorithme en c# il y a quelque temps. L'algorithme construit un contour commun de deux polygones (c'est-à-dire, construit une union sans trous). Le voici.
Étape 1. Créer un graphe qui décrit les polygones.
Entrée : premier polygone (n points), deuxième polygone (m points). Sortie : graphe. Sommet - point de polygone du point d'intersection.
Nous devons trouver des intersections. Itérer à travers tous les côtés des polygones dans les deux polygones [O(n*m)] et trouver des intersections.
-
Si aucune intersection n'est trouvée, ajoutez simplement des sommets et connectez-les au bord.
-
Si des intersections sont trouvées, triez-les par longueur jusqu'à leur point de départ, ajoutez tous les sommets (début, fin et intersections) et connectez-les (déjà dans l'ordre trié) au bord.
Étape 2. Vérifier le graphe construit
Si nous n'avons trouvé aucun point d'intersection lorsque le graphe a été construit, nous avons l'une des conditions suivantes :
- Le polygone1 contient le polygone2 - retourne le polygone1
- Le polygone2 contient le polygone1 - retourne le polygone2
- Le polygone1 et le polygone2 ne s'intersectent pas. Retourne le polygone1 ET le polygone2.
Étape 3. Trouver le sommet en bas à gauche.
Trouvez les coordonnées x et y minimum (minx, miny). Ensuite, trouvez la distance minimale entre (minx, miny) et les points du polygone. Ce point sera le point en bas à gauche.
Étape 4. Construire le contour commun.
Nous commençons à parcourir le graphe à partir du point en bas à gauche et continuons jusqu'à ce que nous y retournions. Au début, nous marquons tous les bords comme non visités. À chaque itération, vous devez sélectionner le point suivant et le marquer comme visité.
Pour choisir le point suivant, choisissez un bord avec un angle interne maximum dans le sens antihoraire.
Je calcule deux vecteurs : le vecteur1 pour le bord actuel et le vecteur2 pour chaque bord non visité suivant (comme présenté dans l'image).
Pour les vecteurs, je calcule :
- Produit scalaire. Il retourne une valeur liée à un angle entre les vecteurs.
- Produit vectoriel. Il retourne un nouveau vecteur. Si la coordonnée z de ce vecteur est positive, le produit scalaire me donne un angle droit dans le sens antihoraire. Sinon (la coordonnée z est négative), je calcule l'angle entre les vecteurs comme 360 - l'angle du produit scalaire.
En résultat, j'obtiens un bord (et un prochain sommet correspondant) avec l'angle maximum.
J'ajoute à la liste de résultat chaque sommet traversé. La liste de résultat est le polygone d'union.
Remarques
- Cet algorithme nous permet de fusionner plusieurs polygones - d'appliquer de manière itérative avec des paires de polygones.
- Si vous avez un chemin composé de nombreux courbes de Bézier et lignes, vous devez d'abord aplatir ce chemin.