WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Volumenberechnung bei Tetraeder-Struktur

 

iammrvip
Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 10.07.2012, 09:33     Titel: Volumenberechnung bei Tetraeder-Struktur
  Antworten mit Zitat      
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

Code:
coords_b(mesh_b(:,2),:) - coords_b(mesh_b(:,1),:)


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;

    tetras_in_layer = ~(tetras_under_layer | tetras_over_layer);
 


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);
   
    fall1tetras = indextrafo(blobs)';
 


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

    out0=logical(out0);
 


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...

Vielen dank im Voraus und beste Grüße
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 10.07.2012, 09:39     Titel: Re: Volumenberechnung bei Tetraeder-Struktur
  Antworten mit Zitat      
Hallo iammrvip,

Statt der Schleife:
Code:
out0 = false(length(tetras_in_layer), 1);
out0(fall1tetras(fall1tetras ~= 0)) = true;

Hilft das bereits weiter?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
iammrvip
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 9
Anmeldedatum: 10.07.12
Wohnort: Dresden
Version: R2009b, 7.9.0.529, 64-bit, maci64
     Beitrag Verfasst am: 10.07.2012, 09:44     Titel:
  Antworten mit Zitat      
Genau das suchte ich!

Besten Dank Smile.

Mein größtes Problem ist, dass mit der MATLAB Syntax viel möglich ist, nur müsste man sie erstmal kennen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.