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