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 ist
.
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
genau einem
, 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
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;