Wie schon erwähnt, wurde die GEOTOOLKIT-Klasse gtTetraNet um die folgenden Prädikate zur Verifikation verschiedendimensionaler touch-Beziehungen zwischen Volumina im 3-dimensionalen Raum erweitert:
int gtTetraNet::touch(const gtTetraNet& t) const; int gtTetraNet::touch_0D(const gtTetraNet& t) const; int gtTetraNet::touch_1D(const gtTetraNet& t, int strict=0) const; int gtTetraNet::touch_2D(const gtTetraNet& t, int strict=0) const;
Die Verwendung dieser Testfunktionen wurde schon geschildert, eine
detaillierte Beschreibung der Implementierung steht aber noch aus.
Alle vier stützen sich auf die Hilfsfunktion getTouchType,
die zu zwei Tetraedernetzen deren Berührdimensionen
zurückgibt, falls sich
die Volumina berühren. Ansonsten werden auch echte (3-dimensionale)
Schnitte erkannt, oder vermeldet, daß die beiden Objekte disjunkt
sind. Das Verfahren ist in Algorithmus 8 zu sehen.
In den Listen
pointList, segmentList und
triangleList werden vorgefundene Berührstellen nach ihrer
Dimension abgelegt, so daß sie jederzeit zur Verfügung stehen.
Die Vergleiche der jeweiligen Simplexe erfolgen analog zu den
topRel-Algorithmen, indem das erste Netz sequentiell
durchlaufen wird und zu jedem Element alle relevanten Simplexe des
anderen Netzes über eine nicht-strikte R-Baum-Anfrage mit
dessen Bounding-Box bestimmt werden (Zeile 4).
Statt einer vollständigen Bewertung der topologischen Beziehung der aktuellen Tetraeder zueinander, reicht es nun hier aus, die beiden 3-Simplexe zu verschneiden (Zeile 6) und diesen Schnitt zu untersuchen. Ist dieser 3-dimensional, so liegt keine Berührstelle sondern ein echter Schnitt vor und die Funktion kann mit der Rückgabe des Wertes -1 abbrechen (Zeile 8). Ansonsten werden die gefundenen Berührobjekte (so es welche gibt) in die entsprechenden Listen einsortiert (Zeile 10) und es folgt die Betrachtung des nächsten Simplexpaares.
Im Anschluß an die Untersuchung der einzelnen Netzelemente zueinander müssen nun nur noch diejenigen Punktberührungen aus der entsprechenden Liste entfernt werden, die zusätzlich innerhalb eines Segmentes (Zeile 15) oder eines Dreiecks (Zeile 20) vorkommen. Genauso werden in Zeile 25 alle Berührsegmente aus der Segment-Liste entfernt, die von einem Berührdreieck aus der Dreiecks-Liste überdeckt werden, so daß schließlich in den drei Listen alle Berührstellen einfach erfaßt sind.
Zuletzt werden dann nur noch die Variablen pointTouch,
segmentTouch und triangleTouch auf 1 gesetzt (Zeile 28),
wenn die entsprechende Liste nicht leer ist
und ein Wert zwischen 0 und 7 zurückgegeben (Zeile 29), welcher
der Kombination der vorgefundenen Berührdimensionen
entspricht
.
Mit diesem Hilfsmittel der getTouchType-Funktion ist es nun leicht, sowohl die strikten, als auch die nicht-strikten Methoden zur Verifikation der verschiedenen touch-Lagen zu implementieren (vgl. bspw. touch_1D in Algorithmus 9). Aber auch das overlap-Prädikat greift auf diese Funktion zurück, da echte Schnitte in einem Rückgabewert von -1 resultieren und das Vorkommen eines solchen echten Schnittes eine notwendige Bedingung für die topologische Beziehung overlap darstellt.