Triangulierung / Volumenberechnung

informatik4U - Hausaufgabenhilfe » Programmiermethoden und Projekte » Mathematik programmieren » Triangulierung / Volumenberechnung « Zurück Vor »

Autor Beitrag
 

Max
Veröffentlicht am Samstag, den 17. November, 2001 - 9:46:   

Hallo!

Ich habe ein Problem: Ich soll das Volumen eines nicht gleichmäßigen Körpers berechnen, der durch Punkte (Sowie aus Dreiecken dieser Punkte) gegeben ist. Ich habe den Körper bereits trianguliert - das heißt die Oberfläche in Dreiecke zerlegt - somit kann ich schon mal die Oberfläche berechnen. Die Frage ist jetzt nur, wie kann ich das Volumen berechnen? Algorithmus?
DANKE
Max
 

Ronny (Wonky)
Veröffentlicht am Samstag, den 17. November, 2001 - 23:03:   

Hi auch
nun ich muste mal bei jemanden abschreiben ..

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
(Quelle www.mathematica.ch)
ich hoffe das hilft weiter sonst must du wohl spezieller werden ...

Gruss Ronny
 

Max
Veröffentlicht am Sonntag, den 18. November, 2001 - 9:21:   

Danke erstmal Ronny!
Jedoch habe ich noch ein paar Fragen:
Ich soll ein paar ewtwas komplexere Objekte berechnen - wie z.B. einen Torus. Ich habe nun bereits die Oberfläche (gebildet durch die Punkte) mit Hilfen von Dreiecken trianguliert.
Heißt das jetzt, dass ich den Ursprung (0/0/0) als Bezugspunkt nehmen soll und diesen dann mit den 3 Punkten des Dreiecks vektoriell verbinde?
Nehmen wir mal an, das Dreieck besitze die 3 Punkte: A(x1/y1/z1), B(x2/y2/z2) und C(x3/y3/z3) wenn ich jetzt (0/0/0) als Bezugspunkt nehme, was genau müsste ich da rechnen? Die Frage ist nur, ob sich die Polyeder ja nicht überschneiden? Somit würde ich ja mehrere Volumina doppelt berechnen...
MFG Max
 

Ronny (Wonky)
Veröffentlicht am Sonntag, den 18. November, 2001 - 11:55:   

Hi Max

äh äh keine Ahnung :)
tut mir leid ich weiß nicht weiter, ist nicht unbedingt mein gebiet
versuche es mal bei http://www.zahlreich.de
oder jemand anderes kann hier helfen

Beitrag verfassen
Beitrag:
Benutzername: Hinweis:
Dies ist ein öffentlicher Bereich. Wenn Du kein Benutzerkonto (erlaubt z.B. automatische e-mail-Benachrichtigung + ...) hast, gib Deinen Namen in das "Benutzername"-Feld ein und lasse das "Passwort"-Eingabefeld leer. Die Angabe Deiner eMail-Adresse ist freiwillig. Mit der Nutzung des Forums erkennst Du die Nutzungsbedingungen an. Bitte also beachten.
Passwort:
Email:
Optionen: URLs innerhalb des Beitrags aktivieren
Auswahl:


keine Hilfe gefunden? Dann klick zu unseren Partnern:
Learn-in! Mathematik Soforthilfe. Klick jetzt! Hier könnte Ihre Werbung erscheinen. Kontakt: werbung@zahlreich.de Hier könnte Ihre Werbung erscheinen. Kontakt: werbung@zahlreich.de