DMUG-Archiv 2001

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Volumen eines unregelmäßigen triangulierten Körpers

At 21:23 07.02.01 +0100, you wrote:
Liebe Listenteilnehmer,

ich bin noch ungeübt im Umgang mit Mathematica; deswegen vorweg schonmal
Entschuldigung, falls meine Frage zu trivial ist.

Ich habe für eine Simulation eine Computertomographie mit anschließender
Triangulation eines Porenkörpers anfertigen lassen und ein VRML-Modell
erhalten. Für einen Ausschnitt des Modells muß ich nun das Volumen bestimmen
und habe dabei so meine Probleme.

Das Modell ist unregelmäßig geformt und läßt sich über ein kleines Skript
bestimmt als aus Polygonen zusammengesetzter Körper in Mathematica einlesen.
Gibt es nun in Mathematica eine Möglichkeit, das Volumen, das durch diese
Flächen eingeschlossen wird, zu bestimmen ?

Vielen Dank im voraus

Mathias Ruppel

Die Berechnung des Volumens ist sehr einfach, wenn alle Polygone Dreiecke sind, welche "richtig" orientiert sind, also etwa im Gegenuhrzeigersinn, wenn man von außen auf den Körper schaut. Dann ist das Volumen des Körpers gleich einem Sechstel der Summe der Determinanten, welche jeweils aus den Ortsvektoren der Eckpunkte eines gegebenen Dreiecks gebildet werden. Das entsprechende Mathematica-Programm sieht so aus:

vol[ T_ ] := Abs[ Apply[ Plus, Map[ Det, T ] ] / 6 ]

Dabei ist T die Liste der Dreiecke, wobei jedes Dreieck als Liste von drei Punkten gegeben ist.
Hier ein triviales Beispiel:
Pyramide mit dem Einheitsquadrat als Grundfläche und Höhe 4:
(Die Grundfläche wurde in zwei Dreiecke zerlegt.)

a = {0, 0, 0}; b = {1, 0, 0}; c = {1, 1, 0}; d = {0, 1, 0}; e = {0.5, 0.5, 4};
P = {{a, d, b}, {b, d, c}, {e, a, b}, {e, b, c}, {e, c, d}, {e, d, a}};
vol[P]
1.33333

Diese Methode funktioniert auch bei beliebig komplexen Polyedern, die z.B. Körper mit Löchern darstellen.

Man kann folgenderweise überprüfen, ob alle Dreiecke richtig orientiert sind:
Jede Kante muss in genau zwei Dreiecken auftreten, und zwar in entgegengesetzten Orientierungen. Das kann man z.B. so machen:

seiten[{a_, b_, c_}] := {{a, b}, {b, c}, {c, a}}
ortest[T_] :=
  Module[{kanten, k1, k2 },
    kanten = Flatten[Map[seiten, T], 1];
    k1 = Union[Map[Sort, kanten]];
    k2 = Map[Reverse, k1];
    Sort[kanten] == Union[k1, k2]
    ]

ortest[P]
True

Beste Grüße,
Johann Linhart
Institut für Mathematik der Universität Salzburg


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html