background image
Da diese geometrische Korrektur für jede Rekursionsstufe durchgeführt wird, werden alle Cracks
und T-Junctions zwischen nebeneinander liegenden Dreiecken mit gemeinsamer Hypotenuse
verhindert. Leider werden durch dieses Verfahren nicht alle Fälle abgedeckt. Beispielsweise grenzen
in beiden Abbildungen 18 und 19 rechts unten Dreiecke einer höheren Stufe diagonal an denen
einer niedrigeren Stufe. Hier gäbe es auch die Möglichkeit, die Dreiecke der niedrigeren Stufe zu
unterteilen. Dies führt aber zu dem Problem, dass man zum einen die Dreiecke eventuell mehrfach
unterteilen müsste und zum anderen auch die benachbarten Dreiecke weiter unterteilen müsste, um
so unter Umständen neu entstandene T-Junctions zu vermeiden.
Aufgrund der hohen Komplexität eines solchen Verfahrens soll an dieser Stelle eine andere
Möglichkeit gezeigt werden, die sich im Laufe der Arbeit entwickelt hat.
4.3.1 Aufbau eines Vertex Sets
Die Dreiecke des 4-8 Meshs werden intern jeweils mit allen drei Eckpunkten gespeichert. Das ist
nicht sehr effizient, da alle Punkte von mehreren Dreiecken benutzt und somit redundant
gespeichert werden. Aber aus dieser Vorgehensweise lässt sich einfach feststellen, welche Punkte
von welchen Dreiecken gemeinsam genutzt werden. Diese Zuordnung wurde durch die
Implementierung eines Vertex Sets in PointMesh erreicht.
Das Vertex Set ist ein dynamischer STL-Vektor eines abstrakten Datentyps vSet. In diesem Vektor
werden alle Vertices der Dreiecke jeweils nur einmal gespeichert.
Der Datentyp vSet integriert zunächst die folgenden Daten:
Index des vertexSet-Eintrags
Indizes aller Dreiecke, die dieses Vertex benutzen
Position des Vertex in 3D-Raumkoordinaten
Über die Funktion void update_vSet(...) wird nach der Vermaschung ermittelt, welche Dreiecke
einen jeweiligen Punkt des Vertex Sets nutzen. Deren Indizes werden innerhalb des Vertex Sets
abgespeichert. Desweiteren werden dem Vertex Set spezielle Punkte hinzugefügt, die nicht direkt
von Dreiecken genutzt werden, sogenannte ,,Split Points" und ,,Forbidden Points", die ebenfalls in
diesem Datentyp integriert werden.
4.3.1.1 Split Points und Forbidden Points
Bereits beim Erstellen des Meshs werden für jedes endgültig gezeichnete Dreieck zusätzliche Daten
abgespeichert. Der Split Point definiert den Mittelpunkt der Hypotenuse, an dem ein Dreieck weiter
unterteilt werden würde, auch wenn das zum Zeitpunkt der Erstellung des Meshs durch die
Funktion subdivide(...) nicht mehr getan wird, da die Restriktionsbedingungen erfüllt sind. Wie wir
aber im Folgenden sehen werden, kann eine weitere Unterteilung zur Vermeidung von Cracks
sinnvoll sein.
Darüber hinaus werden während des Unterteilungsprozesses für jedes zu zeichnende Dreieck zwei
,,verbotene" Punkte, genannt ,,Forbidden Points", gespeichert. Diese Punkte liegen genau auf den
Mittelpunkten der Katheten und wurden deshalb so benannt, weil an diesen Stellen kein Vertex
eines benachbarten Dreiecks liegen darf, da dort sonst ein Crack oder eine T-Junction entstünde.
24