Verfasst am: 31.01.2011, 12:37
Titel: Punktewolke erweitern und plotten und als STL ausgeben
Hallo liebe Gemeinde,
ich bin bereits auf einem guten Weg, jedoch bin ich sehr unerfahren und erhoffe mir daher noch ein paar Tipps zum Finetuning von euch.
Kurz zum Problem:
Eigentlich ist oder war das Ziel, eine vermessene Punktewolke in 3D-Reshaper zu laden, zu glätten und dann in Abaqus (FEM) zu importieren um dort einen Volumenkörper zu erzeugen, da die Punktewolke ja nur eine infinitesimal dünne Fläche ist, damit dort FEM-Untersuchungen gestartet werden können.
Allerdings geht das bis jetzt noch nicht. Ich verfolge nun den Ansatz über Matlab, mit dem Ziel, die Punktewolke um weitere Punkte zu erweiteren, damit diese einen 3D-Körper wird mit einer ebenen Grundfläche und oben der vermessenen Oberfläche. Das ganze würde ich dann gerne als STL exportieren können und in Abaqus laden - dort dann vermeshen und fertig ist die Laube.
Wie weit bin ich:
Zur Zeit lese ich meine Punktewolke ein und bestimme mit einem einfachen Algorithmus eine bestimmte Anzahl zusätzlicher Punkte unter jedem Punkt. Theoretisch reicht ein Punkt im richtigen Abstand unter jedem Punkt, allerdings ist die Idee dahinter, später in Abaqus keine zu großen Elemente zu bekommen.
Die erweiterte Wolke lasse ich dann mit trimesh plotten und speichere den Vektor wieder in einer ASC-File.
Womit bin ich unzufrieden?
Ich will eigentlich ungern das Rad neuerfinden. Ich denke es gibt bereits mächtige MATLAB-Algorithmen, aber ich kenne Sie nicht. Zur Zeit dauert das erweiteren einer Wolke von 180 000 auf 600 000 Punkte 2h - später werden unsere Wolken 2 Mio Punkte habe, und mehr oder weniger auch brauchen - mein Algorithmus scheint mir da sehr uneffektiv zu sein.
Der Plot gefällt mir auch nicht. Die Fläche müsste eigentlich viel planer und geschmeidiger sein. Wie kann ich sie glätten oder welcher Plot Befehl ist denn der richtige? Ich habe bereits fast alle probiert. surfc oder meshc geben Fehler aus, trisurf sieht noch 'besser' aus
STL: Ich plane den Einsatz von surf2stl - jemand damit Erfahrungen? oder Kennt jemand etwas besseres?
Über Ratschläge würde ich mich sehr freuen,
anbei meine Daten.
Danke
Code:
function out = start()
%START Summary of this function goes here
% Detailed explanation goes here
function[ out ] = wolke_komplett(datei,zmin,ab,pre)
%Wolke_komplett fügt der Punktewolke weitere Punkte hinzu,
% damit eine Solidkörper in Abaqus verwendet werden kann.
%Preallocate b, nehme an
if pre == 1
b = zeros(length(a)*abgeschaetze_anzahl,3);
end
%% Duplizieren der Wolke for i = 1:length(a)
b(i,:) = a(i,:); %kopiere matrix a in matrix b
end
%% Erweitern der Wolke
bla = length(a); % Zählvariable der Wolke b for i = 1:length(a)
dz = abs(a(i,3)- zmin);
anzahl = fix(dz/ab);
bla = bla + 1;
for j = 0:anzahl
bla = bla + 1;
b((bla+1),1:2) = a(i,1:2);
b(bla,3) = (zmin + j*ab);
end end
%% Ausgabe der Daten disp(['Anzahl an Elementen in b = ' num2str(length(b))]);
Zum testen einfach start aufrufen.
Die beiden Matlab-Plots zeigen die Wolke vor dem erweitern - das PNG zeigt die zusätzlchen Punkteebenen, die noch sehr grob verteilt sind
In der Zip-File befindet sich die ASC-Punktewolke...
Eine sehr gute Idee den Profiler um Hilfe zu bitten!
Die Lösung heißt pre-allocation. Wenn Matlab in jeder Iteration ein vorhandenes Array vergrößert, muss es zwischen Speicher für durch n, n+1, n+2, n+3, ... Speicherzellen reservieren. Der Aufwand ist riesig!
Also musst Du zuerst herausfinden, wie groß das Array b wird und es dann per "b = zeros(maxLen, 3)" auf einmal reservieren.
Die Schleife über j kann dann eigentlich entfallen, weil Du z.B, alle "b(bla+1:bla+anzahl, 1) = a(i, 1)" aufeinmal setzen kannst.
Und die dritte Spalte kannst Du auch ohne Schleife erzeugen:
"zmin:ab:(zmin + anzahl*ab);"
Und damit dürfe das Programm dann in wenigen Sekunden durchrauschen.
..habe ich den Speicher für die Var b bereits reserviert. Oder reicht dies nicht aus? Die Abfrage ist natürlich müll, weil ich Sie immer auf 1 setzen werden, ich wollte nur mal den unterschied sehen zwischen Pre = 1 und Pre = 0.
Die anderen Ideen versuche ich zu verstehen und umzusetzen - Danke vielmals.
Danke, der Algorithmus ist jetzt sehr viel schneller.
Ich habe die Punktwelke nun mit MyRobustCrust von Matlab File Exchenge geplottet, siehe Anhang, und frage mich, wie ich dieses Volumen als STL datei bekomme.
surf2stl schreibt ohne Fehlermeldung nur 0 Facets, und Patch2stl sagt nur, dass meine Punktewolke als Vertices und Facets vorliegen muss. Ich weiß aber null, was das heißt. Habe nach wie vor nur einen X (=b(:,1)), Y(=b(:,2)) und Z(=b(:,3)) Verktor mit allen Daten...
Wenn "bla" immer nur um 1 hochgezählt wird, werden alte Werte überschrieben. Ich bin mir aber nicht sicher und kann mir nicht auf Anhieb erklären, wie genau diese Grafik entsteht. Aber vielleicht klappt es ja.
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.