background image
In Abbildung 20 werden exemplarisch diese speziellen Punkte dargestellt. In der linken Zeichnung
liegen zwei Punkte der roten Dreiecke einer höheren Rekursionsstufe an einem verbotenen Punkt
des grauen Dreiecks einer niedrigeren Rekursionsstufe. In diesem Fall werden die beiden roten
Dreiecke zu einem Dreieck einer Stufe niedriger vereinigt (merge-Operation), um die T-Junction zu
vermeiden. Dadurch geht zwar Detail verloren, dafür erspart man sich aber die mehrfache
Unterteilung des grauen Dreiecks und dessen eventueller Nachbarn.
In der rechten Abbildung liegen zwei Punkte der beiden blauen Dreiecke (höhere Rekursionsstufe)
an einem Split Point des grauen Dreiecks von niedrigerer Stufe. Hier wird das graue Dreieck in
zwei neue unterteilt (split-Operation), um die T-Junction zu entfernen.
Die Funktion update_vSet(...) speichert auch diese drei Punkte als separate Einträge im Vertex Set
ab, die über die Flags isSplitPoint und isForbiddenPoint innerhalb des Datentyps vSet entsprechend
als solche gekennzeichnet werden. Zudem wird auch der Index des Dreiecks gespeichert, zu dem
der Split Point oder die Forbidden Points gehören.
Die Funktion
void check_vSet()
überprüft nach dem Aufbau des Vertex Sets, welche Dreiecke ein Vertex des Vertex Set benutzen und
aktualisiert daraufhin dessen Indexliste. Im gleichen Durchlauf wird überprüft, ob dieses Vertex ein
Split Point oder ein Forbidden Point ist. Falls es ein Split Point ist, wird das Dreieck, zu dem dieser
Split Point gehört, weiter unterteilt. Die Funktion void splitpoint_split(triangle3 &tri) führt genau
diese Unterteilung durch.
Ist das Vertex ein Forbidden Point, werden alle Dreiecke, die diesen Punkt benutzen, gelöscht
(draw-Flag = false) und stattdessen ein daran lückenlos anschließendes Dreieck wiederhergestellt,
das auf eine Rekursionsstufe höher als die des Dreiecks des Forbidden Points gesetzt wird. Da
dieses neue Dreieck wieder zwei Forbidden Points besitzt, wird auch für diese unmittelbar danach
überprüft, ob sie schon von anderen Dreiecken benutzt werden. Ist dies der Fall, was relativ häufig
auftritt, werden die daran angrenzenden Dreiecke über die Funktion merge_tris(triangle3 &tri1,
triangle3 &tri2) zu einem neuen Dreieck der nächsthöheren Stufe vereint. Im Prinzip wäre es hier
nicht nötig gewesen, ein neues Dreieck einzuführen, da genau ein solches schon im tri_set-Vektor
25
Abbildung 20: Forbidden Points und Split Points.