Das ist eine sehr gute Frage. Ich habe vor einiger Zeit den gleichen Algorithmus auf c # implementiert. Der Algorithmus konstruiert eine gemeinsame Kontur aus zwei Polygonen (dh konstruiert eine Vereinigung ohne Löcher). Hier ist es.
Schritt 1. Erstellen Sie ein Diagramm, das die Polygone beschreibt.
Eingabe: erstes Polygon (n Punkte), zweites Polygon (m Punkte). Ausgabe: Grafik. Scheitelpunkt - Polygonpunkt des Schnittpunkts.
Wir sollten Kreuzungen finden. Durchlaufen Sie alle Polygonseiten in beiden Polygonen [O (n * m)] und finden Sie alle Schnittpunkte.
Wenn keine Kreuzung gefunden wird, fügen Sie einfach Scheitelpunkte hinzu und verbinden Sie sie mit der Kante.
Wenn Schnittpunkte gefunden werden, sortieren Sie sie nach Länge bis zu ihrem Startpunkt, fügen Sie alle Scheitelpunkte (Start, Ende und Schnittpunkte) hinzu und verbinden Sie sie (bereits in sortierter Reihenfolge) mit der Kante.
Schritt 2. Überprüfen Sie das konstruierte Diagramm
Wenn wir beim Erstellen des Diagramms keine Schnittpunkte gefunden haben, haben wir eine der folgenden Bedingungen:
- Polygon1 enthält Polygon2 - Rückgabe von Polygon1
- Polygon2 enthält Polygon1 - Polygon2 zurückgeben
- Polygon1 und Polygon2 schneiden sich nicht. Rückgabe von Polygon1 UND Polygon2.
Schritt 3. Suchen Sie den Scheitelpunkt unten links.
Finden Sie die minimalen x- und y-Koordinaten (minx, miny). Finden Sie dann den Mindestabstand zwischen (minx, miny) und den Punkten des Polygons. Dieser Punkt ist der Punkt unten links.
Schritt 4. Konstruieren Sie eine gemeinsame Kontur.
Wir beginnen, den Graphen vom linken unteren Punkt aus zu durchlaufen und fahren fort, bis wir wieder darin sind. Zu Beginn markieren wir alle Kanten als nicht besucht. Bei jeder Iteration sollten Sie den nächsten Punkt auswählen und als besucht markieren.
Um den nächsten Punkt auszuwählen, wählen Sie eine Kante mit einem maximalen Innenwinkel gegen den Uhrzeigersinn.
Ich berechne zwei Vektoren: Vektor1 für die aktuelle Kante und Vektor2 für jede nächste nicht besuchte Kante (wie im Bild dargestellt).
Für Vektoren berechne ich:
- Skalarprodukt (Punktprodukt). Es gibt einen Wert zurück, der sich auf einen Winkel zwischen Vektoren bezieht.
- Vektorprodukt (Kreuzprodukt). Es wird ein neuer Vektor zurückgegeben. Wenn die Z-Koordinate dieses Vektors positiv ist, gibt mir das Skalarprodukt den rechten Winkel gegen den Uhrzeigersinn. Andernfalls (Z-Koordinate ist negativ) berechne ich den Abrufwinkel zwischen Vektoren als 360 - Winkel vom Skalarprodukt.
Als Ergebnis erhalte ich eine Kante (und einen entsprechenden nächsten Scheitelpunkt) mit dem maximalen Winkel.
Ich füge jeden übergebenen Scheitelpunkt zur Ergebnisliste hinzu. Ergebnisliste ist das Vereinigungspolygon.
Bemerkungen
- Dieser Algorithmus ermöglicht es uns, mehrere Polygone zusammenzuführen, um sie iterativ mit Polygonpaaren anzuwenden.
- Wenn Sie einen Pfad haben, der aus vielen Bezierkurven und -linien besteht, sollten Sie diesen Pfad zuerst reduzieren.