next up previous contents
Next: Wichtige interne Funktionen Up: Die Klasse gtTetraNet Previous: Randverwaltung

Topologische 3D-Beziehungen

Für Volumina, deren Modellierung innerhalb der Klasse gtTetraNet geschieht, werden im Rahmen dieser Arbeit Methoden in das GEOTOOLKIT integriert, die es erlauben, topologische Beziehungen zu anderen Volumina oder Flächen zu bestimmen. Welche topologischen Beziehungen für welches Objektpaar jeweils möglich sind, wurde schon im 5. Kapitel erörtert. Hier sollen nun die Köpfe der entsprechenden Funktionen angegeben und deren jeweilige Funktionalität beurteilt werden. Details zur Implementierung der Klassifikationsfunktionen ``topRel`` folgen dann im nächsten Abschnitt, während ausgewählte topologische Prädikate in 6.3 genauer betrachtet werden.

Zuerst widmen wir uns dem Fall zweier Volumina bzw. den topologischen Beziehungen, die zwischen zwei Objekten des Typs gtTetraNet auftreten können.


Das topologische Prädikat disjoint wird genau dann wahr, wenn sich die beiden Volumina weder schneiden noch berühren, sie also einen Abstand > 0 zueinander aufweisen:

   int gtTetraNet::disjoint(const gtTetraNet& t) const;


Zwei Objekte des Typs gtTetraNet stehen zueinander in der topologische Beziehung touch, wenn sie sich berühren. Hierzu werden verschiedene Prädikate angeboten, um auf die Dimension dieser Berührstelle eingehen zu können. Während das dimensionslose touch bei jeder Berührung wahr wird, liefert touch_0D nur dann true zurück, wenn es eine Punktberührung, aber keine Berührstellen höherer Dimension zwischen den beiden Volumina gibt. Entsprechendes gilt für die Methoden touch_1D und touch_2D, für deren Gültigkeit die höchste Dimension einer Berührung 1- bzw. 2-dimensional sein muß. Bei diesen beiden Prädikaten kann man zudem optional noch ein strict-Flag mit übergeben, welches dann auch niederdimensionale Berührstellen verbietet, wenn es gesetzt istgif. Einzelheiten zur Implementierung dieser Funktionen sind in Abschnitt 6.3 zu finden.

   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;


Da zwei Volumina zueinander keine cross-Lage aufweisen können (vgl. Definition 3.14) ist natürlich auch kein entsprechendes topologisches Prädikat zu implementieren. Jede echte Überlappung zweier Tetraedernetze, welche weder komplett dem ersten noch dem zweiten Objekt entspricht, stellt vielmehr ein overlap dar und wird von der folgenden gtTetraNet-Methode erkannt:

   int gtTetraNet::overlap(const gtTetraNet& t) const;


Die Methoden des covers entsprechen funktionell denen des touch, da auch vier verschiedene topologische Prädikate angeboten werden, welche die Dimension der Randberührung der beiden Volumina unterschiedlich beurteilen. Damit es zu einem covers kommt, darf kein Teil des ersten Tetraedernetzes aus dem zweiten herausragen und es muß eine Berührung des Randes von Innen vorliegen, die der angegebenen Dimension entspricht. Bei einer höheren Dimension wird ebenso verworfen, wie beim Auftreten von niederdimensionalen Berührstellen, falls das strict-Flag gesetzt ist:

   int gtTetraNet::covers(const gtTetraNet& t) const;
   int gtTetraNet::covers_0D(const gtTetraNet& t) const;
   int gtTetraNet::covers_1D(const gtTetraNet& t, int strict=0) const;
   int gtTetraNet::covers_2D(const gtTetraNet& t, int strict=0) const;


Die inversen topologischen Prädikate zu den oberen vieren werden mit den folgenden covered-Methoden in das GEOTOOLKIT integriert. Dabei entspricht die topologische Beziehung tex2html_wrap_inline6034 genau einem tex2html_wrap_inline6036 , so daß nur die Reihenfolge der beiden Tetraedernetze entsprechend angepaßt werden muß.

   int gtTetraNet::covered(const gtTetraNet& t) const;
   int gtTetraNet::covered_0D(const gtTetraNet& t) const;
   int gtTetraNet::covered_1D(const gtTetraNet& t, int strict=0) const;
   int gtTetraNet::covered_2D(const gtTetraNet& t, int strict=0) const;


Ebenfalls zwei inverse topologische Beziehungen werden durch die beiden Prädikate in und ni erfaßt, welche angeben, ob das eine Tetraedernetz vollständig in dem anderen liegt, oder aber dieses echt enthält. Der Rand darf dabei weder geschnitten noch berührt werden:

   int gtTetraNet::in(const gtTetraNet& t) const;
   int gtTetraNet::ni(const gtTetraNet& t) const;


Neben den bisher aufgezählten topologischen Prädikaten wird im GEOTOOLKIT natürlich auch die Möglichkeit gegeben, die topologische Lage zwischen zwei Volumina zu bestimmen, ohne alle Beziehungen zu testen. Dies geschieht mit der gtTetraNet-Methode topRel, welche die topologische Beziehung der beiden Tetraendernetze als topFlag-Wert zurückliefert:

   topFlag gtTetraNet::topRel(const gtTetraNet& t) const;


Implementierungsdetails zu dieser Funktion folgen in Abschnitt 6.2. Zunächst wird jedoch in 6.1.5 noch genauer auf den Datentyp topFlag eingegangen, welcher das in 5.2 erarbeitete Repräsentationsmodell topologischer Beziehungen tex2html_wrap_inline5923 für das GEOTOOLKIT umsetzt.


Nun werden die topologischen Beziehungen summiert, die innerhalb der gtTetraNet-Klasse für den Fall angeboten werden, daß die relative räumliche Lage eines Volumens zu einer Fläche beurteilt werden soll.

Die topologische Prädikate disjoint und touch erfordern sicherlich keiner weiteren Betrachtung:

   int gtTetraNet::disjoint(const gtTriangleNet& t) const;

   int gtTetraNet::touch(const gtTriangleNet& t) const;
   int gtTetraNet::touch_0D(const gtTriangleNet& t) const;
   int gtTetraNet::touch_1D(const gtTriangleNet& t, int strict=0) const;
   int gtTetraNet::touch_2D(const gtTriangleNet& t, int strict=0) const;


Im Gegensatz zum Fall zweier Volumina, in dem kein cross wohl aber eine overlap-Lage möglich ist, kann bei der Volumen/Fläche-Situation kein overlap auftreten, da beide Objekte unterschiedliche Dimensionen aufweisen. Statt dessen wird hier immer dann ein cross erreicht, wenn ein echter Schnitt vorliegt, die Fläche aber nicht komplett in dem Volumen enthalten ist:

   int gtTetraNet::cross(const gtTriangleNet& t) const;


Die folgenden Methoden sind wieder analog zum Volumen/Volumen-Fall gestaltet - wie man jedoch direkt sieht, fallen die Prädikate covered und in heraus, da ein Tetraedernetz (Volumen) nicht in einem Dreiecksnetz (Fläche) liegen kann:

   int gtTetraNet::covers(const gtTriangleNet& t) const;
   int gtTetraNet::covers_0D(const gtTriangleNet& t) const;
   int gtTetraNet::covers_1D(const gtTriangleNet& t, int strict=0) const;
   int gtTetraNet::covers_2D(const gtTriangleNet& t, int strict=0) const;

   int gtTetraNet::ni(const gtTriangleNet& t) const;


Die fehlenden topologischen Beziehungen erhält man jedoch durch eine Vertauschung der beiden Argumente, so daß die entsprechenden Prädikate in der Klasse gtTriangleNet implementiert sind.

Eine Methode zur Bestimmung der topologischen 3D-Beziehung zwischen einem Volumen und einer Fläche ist natürlich auch implementiert. Der Aufruf von topRel liefert auch hier ein topFlag zurück, welches dieser Beziehung entspricht:

   topFlag gtTetraNet::topRel(const gtTriangleNet& t) const;


next up previous contents
Next: Wichtige interne Funktionen Up: Die Klasse gtTetraNet Previous: Randverwaltung

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