TL; DR Sie müssen boolesche Operationen mithilfe von BSP-Bäumen implementieren.
Nun, es scheint, dass wir hier über Konstruktive Festkörpergeometrie sprechen . Ich habe CSG auf kommerzieller Ebene implementiert, damit ich ein oder zwei Dinge darüber weiß.
Der klassische Artikel über CSG heißt Merging BSP Trees Yields Polyhedral Set Operations. Um ehrlich zu sein, ist es hier zu viel zu erklären, aber der Algorithmus befasst sich kurz gesagt mit Polygonen, die auf der gleichen Ebene liegen wie eine binäre Raumpartitionierung, also im Grunde genommen konstruieren ein BSP-Baum aus jedem Polygonnetz. Der zweite Schritt ist das Zusammenführen dieser BSP-Bäume. Sie nehmen einfach einen Baum und fügen ihn in den anderen ein. Der Algorithmus erklärt dann weiter, wie mit jedem Blattknoten zum Teilen und Subtrahieren der Knoten umgegangen wird. Knoten, die in der endgültigen Form nicht benötigt werden, werden entfernt, andere erhalten das entsprechende übergeordnete Element.
Aber warte! Das Papier handelt im Grunde genommen von Polygonnetzen und 3D-Ebenen, NEIN?
Der Algorithmus kann auf jede Dimension verallgemeinert werden. In Ihrem 2D-Fall ist es daher einfach, Liniensegmente anstelle von Ebenen als binäre Partitionen zu verwenden. Jedes Polygon wird also in einen BSP-Baum konvertiert, bevor die beiden zusammengeführt werden. Schließlich überqueren Sie den resultierenden Baum, um das endgültige Polygon zu erzeugen.
Beachten Sie, dass dieser Algorithmus und CSG im Allgemeinen das Rendern und Vernetzen von Flächen nicht direkt und nicht wirklich bereit zum Rendern ist. Daher müssen Sie die Flächen der endgültigen BSP-Bäume extrahieren. Ich finde Raytracing auch einfacher, um das CSG-Ergebnis zu rendern. Sie brauchen nur die Strahlen, um den Baum zu durchlaufen, anstatt die Flächen zu extrahieren und tatsächlich zu teilen (denken Sie daran, dass wir nur mit binären Partitionen arbeiten).
Bezüglich der numerischen Robustheit. Es ist gut zu bemerken, dass es zwei Arten von geometrischen Berechnungen gibt:
- Diejenigen , die auf dem Bau basieren, Sie bauen eine Form basierend auf dem Ergebnis einer früheren Operation. Zum Beispiel
y = sqrt(x)
und dann y
in einer neuen Operation verwenden. Dies nennt man Konstruktion; Das Problem ist, dass sich numerische Fehler schnell ansammeln.
- Alternativ gibt es Operationen, die stattdessen Prädikate verwenden. Anstatt Konstruktionen zu verwenden, fragen Sie einfach, ob eine Bedingung wahr / falsch ist, und verwenden in verschiedenen Operationen denselben Wert. Zu den klassischen Tests gehören der Inircle-Test und der Orientierungstest. Dies ist auch ein Verdacht auf numerische Fehler, insbesondere wenn Sie einfache oder doppelte Genauigkeit verwenden, aber in der Regel bessere Ergebnisse erzielen. Es gibt andere Lösungen, die sich in Bezug auf Geschwindigkeit und Genauigkeit unterscheiden. Hier ist eine der jüngsten Arbeiten, in denen Konstruktionen vermieden werden, indem eine ebenenbasierte Geometrie verwendet wird, um genaue Ergebnisse zu erzielen. Ich werde auch aus der Zeitung zitieren:
Das Konzept der ebenenbasierten Darstellung von Polygonnetzen wurde erstmals von Sugihara und Iri beschrieben [SI89]. Diese Art der Darstellung bietet einen wichtigen Vorteil bei Aufgaben, bei denen die Topologie von Volumenkörpern, die durch Netze dargestellt werden, geändert werden muss, z
Und zum Schluss möchte ich hinzufügen, dass ich empfehlen würde, mit BSP-FAQs zu beginnen, wenn Sie Ihre BSP-CSG-Implementierung starten möchten .