next up previous contents
Next: Überlappung zweier Flächen Up: Algorithmen ausgewählter Prädikate Previous: Algorithmen ausgewählter Prädikate

Berührung zweier Volumina

 

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ührdimensionengif 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.

  algorithm2454

In den Listengif 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 istgif und ein Wert zwischen 0 und 7 zurückgegeben (Zeile 29), welcher der Kombination der vorgefundenen Berührdimensionen entsprichtgif.

  algorithm2484

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.


next up previous contents
Next: Überlappung zweier Flächen Up: Algorithmen ausgewählter Prädikate Previous: Algorithmen ausgewählter Prädikate

Stefan Hecht
Thu Aug 26 14:06:24 MET DST 1999