Verfasst am: 10.07.2012, 09:33
Titel: Volumenberechnung bei Tetraeder-Struktur
Hallo! Wir haben folgendes Problem: Zum Berechnen des Volumens einer Flasche nähern wir sie durch Tetraeder. Das Ganze sieht dann wie folgt aus: Wir haben zwei Listen
coords = hat ca 50k Zeilen mit jeweils 3 Spalten
x1 y1 z1
x2 y2 z2
...
die jeweils die Koordinaten eines Eckpunktes repräsentieren. Und eine Liste
mesh = hat ca 300k Zeilen mit jeweils 4 Spalten
a11 a12 a13 a14
a21 a22 a23 a24
...
Jede Zeile stellt hier als die Eckpunkte eines Tetreaders (also a11 ist die Zeile a11 in coords) dar. So können also z.B. über
ein Richtungsvektor zwischen der x und y Koordinate erstellt werden.
Die Flasche ist mit einer gewissen Flüssigkeitshöhe gefüllt. Wir wollen nun für feste Höhe "h" die Tetraeder-Struktur durch eine Ebene schneiden, um das Volumen exakter berechnen zu können.
Die Idee war nun folgende:
Wir bestimmten alle Tetraeder in der Grenzschicht
Code:
tetras_under_layer = coords(mesh(:,1),3) <= h & ...
coords(mesh(:,2),3) <= h & ...
coords(mesh(:,3),3) <= h & ...
coords(mesh(:,4),3) <= h;
tetras_over_layer = coords(mesh(:,1),3) >= h & ...
coords(mesh(:,2),3) >= h & ...
coords(mesh(:,3),3) >= h & ...
coords(mesh(:,4),3) >= h;
Dies gibt uns eine logische Matrix. Nun sind mehrere Fälle zu unterscheiden.
Hier liegt nun unser Problem. Betrachten wir z.B. den Fall wo 1 Punkt des Tetreaders über der Schicht liegt und 3 darunter. Dann wollten wir erstmal alle Tetraeder, die dies betrifft isolieren, um das Volumen berechnen zu lassen.
Ich habe das folgendermaßen gelöst:
Code:
% Durchtesten ob jeweils eine der Koordinaten über der Grenzschicht der Höhe "h" liegt
blobs = (coords(mesh(tetras_in_layer, 1), 3) > h & coords(mesh(tetras_in_layer, 2), 3) < h & coords(mesh(tetras_in_layer, 3), 3) < h & coords(mesh(tetras_in_layer, 4), 3) < h) | ... (coords(mesh(tetras_in_layer, 1), 3) < h & coords(mesh(tetras_in_layer, 2), 3) > h & coords(mesh(tetras_in_layer, 3), 3) < h & coords(mesh(tetras_in_layer, 4), 3) < h) | ... (coords(mesh(tetras_in_layer, 1), 3) < h & coords(mesh(tetras_in_layer, 2), 3) < h & coords(mesh(tetras_in_layer, 3), 3) > h & coords(mesh(tetras_in_layer, 4), 3) < h) | ... (coords(mesh(tetras_in_layer, 1), 3) < h & coords(mesh(tetras_in_layer, 2), 3) < h & coords(mesh(tetras_in_layer, 3), 3) < h & coords(mesh(tetras_in_layer, 4), 3) > h)
% nun wird eine Matrix fall1tetras erstellt, deren Einträge die jeweils als der MESH Matrix zu wählenden Zeilen sind
tmp = 1:length(tetras_in_layer);
indextrafo = tmp(tetras_in_layer);
Soweit so gut. Nun ist das Problem. Für die weitere Volumenberechnung möchten wir, dass die Matrix die selbe Zeilenanzahl wie MESH hat, einfach an allen Stellen 1, wo die jeweils betroffenen Tetreader stehen, sonst 0.
Denn die Idee: So könnte man in einer gesonderten Funktion das Volumen für den Fall einfach bestimmen lassen, indem man mesh(out0) aufruft und dann das Volumen berechnen lässt und einfach sämtliche Fälle aufaddiert.
Ich habe das nun so gelöst:
Code:
% erstellt Matrix out, nur Nullen. Setze in den betreffenden Zeilen 1, mache dann eine logische Matrix daraus
out0 = zeros(length(tetras_in_layer),1);
for i = 1:length(fall1tetras) if(fall1tetras(i) ~= 0)
out0(fall1tetras(i)) = 1;
end end
Nun meine Frage: Geht dies nicht ohne Schleifen zu realisieren? Das Problem ist, wie schon angedeutet: Wir möchten für die Volumenberechnung mehrere Fälle unterscheiden (1 Punkt drüber, 3 darunter; 2 darüber, 2 darunter).
Dafür möchten wir logische Matrizen, wo z.B. in Zeile 345 eine 1 steht, wenn Tetreader in MESH Zeile 345 betroffen ist, für die weitere Berechnung.
Eigentlich also eher eine Frage zur Syntax, aber ich wusste nicht, ob sie doch hier eher passt...
Mein größtes Problem ist, dass mit der MATLAB Syntax viel möglich ist, nur müsste man sie erstmal kennen...
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.