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

Punktewolke erweitern und plotten und als STL ausgeben

 

dabauer82
Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 31.01.2011, 12:37     Titel: Punktewolke erweitern und plotten und als STL ausgeben
  Antworten mit Zitat      
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 Smile

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

% wolke_komplett : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%      
%      AUTHOR:    
%      DATE:      2011-01-29
%      VERSION:   0.001
%
% CHANGELOG : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Räume Komandozeile auf
clc;

% Räume Workspace auf
clear;

disp('>> Rechne mit Preallokation... ');
tic;
b = wolke_komplett('wolke180k.asc',-0.1,0.1,1);
save -ASCII wolke180k_mod_0.1_0.1_pre.asc b
toc;

out = 'all done';
end


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

% wolke_komplett : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%      
%      AUTHOR:    
%      DATE:      2011-01-29
%      VERSION:   0.001
%
% CHANGELOG : %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Schätze Anzahl an zusätzlichen Punkten zwecks Pre-Allocation ab
abgeschaetze_anzahl = abs(fix(zmin/ab));

% Lade Datei ein
a = load(datei);

%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))]);

tri = delaunay(b(:,1),b(:,2));
figure
title('trimesh')
trimesh(tri,b(:,1),b(:,2),b(:,3))
%colormap hsv
out = b;

%end
 


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 Smile
In der Zip-File befindet sich die ASC-Punktewolke...

Neues Bild.png
 Beschreibung:

Download
 Dateiname:  Neues Bild.png
 Dateigröße:  24.6 KB
 Heruntergeladen:  1080 mal
wolke180k.zip
 Beschreibung:

Download
 Dateiname:  wolke180k.zip
 Dateigröße:  332.66 KB
 Heruntergeladen:  579 mal
180k_z.jpg
 Beschreibung:

Download
 Dateiname:  180k_z.jpg
 Dateigröße:  109.52 KB
 Heruntergeladen:  1094 mal
180k_iso.jpg
 Beschreibung:

Download
 Dateiname:  180k_iso.jpg
 Dateigröße:  75.2 KB
 Heruntergeladen:  1044 mal
Private Nachricht senden Benutzer-Profile anzeigen


dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 31.01.2011, 15:00     Titel:
  Antworten mit Zitat      
Der Matlab-Profiler hat mir übrigens ausgegeben, dass ich in der Zeile

Code:
b((bla+1),1:2) = a(i,1:2);

7698.03 Sekunden von insgesamt 8000 Sekunden verschwende.

Hat jemand eine Idee wie man diese Optimieren kann?
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: 31.01.2011, 15:50     Titel:
  Antworten mit Zitat      
Hallo dabauer,

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.

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

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 31.01.2011, 16:09     Titel:
  Antworten mit Zitat      
Preallocation habe ich meiner Meinung nach schön berücksichtigt:

In der Zeile...

Code:
%Preallocate b, nehme an
if pre == 1
    b = zeros(length(a)*abgeschaetze_anzahl,3);
end


..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.
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 31.01.2011, 22:00     Titel:
  Antworten mit Zitat      
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...

02.png
 Beschreibung:

Download
 Dateiname:  02.png
 Dateigröße:  464.18 KB
 Heruntergeladen:  1060 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
dabauer82
Themenstarter

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 02.02.2011, 13:51     Titel:
  Antworten mit Zitat      
Hallo Jan S,

ich habe noch ein Problem mit deinem Code-Vorschlag.
Ich hab deinen Tipp nun umgesetzt:

Code:
for i = 1:length(a)  
    dz = abs(a(i,3)- zmin);
    anzahl = fix(dz/ab);    % falls mehere Zwischenebenen gewünscht sind
    bla = bla + 1;
    b(bla:bla+anzahl, 1) = a(i, 1);
    b(bla:bla+anzahl, 2) = a(i, 2);
    b(bla:bla+anzahl, 3) = (zmin:ab:(zmin + anzahl*ab));
end


aber das Problem, dass diese Zwischenebenen in Z-richtung nur einmal hinzugefügt werden. Eine Idee warum?

Siehe Grafik

untitled.jpg
 Beschreibung:

Download
 Dateiname:  untitled.jpg
 Dateigröße:  14.43 KB
 Heruntergeladen:  1042 mal
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: 02.02.2011, 14:51     Titel:
  Antworten mit Zitat      
Hallo dabauer82,

Versuche es mal so:
Code:

bla = 1;
for i = 1:length(a)  
    dz = abs(a(i,3)- zmin);
    anzahl = fix(dz/ab);
    b(bla:bla+anzahl, 1) = a(i, 1);
    b(bla:bla+anzahl, 2) = a(i, 2);
    b(bla:bla+anzahl, 3) = (zmin:ab:(zmin + anzahl*ab));
    bla = bla + anzahl;
end

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.

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

Forum-Century

Forum-Century



Beiträge: 184
Anmeldedatum: 21.03.08
Wohnort: ---
Version: R2008a, R2010b
     Beitrag Verfasst am: 02.02.2011, 16:19     Titel:
  Antworten mit Zitat      
korrekt!
Danke.

Der STL-Export funktioniert auch. Falls jemand interesse hat.
Private Nachricht senden Benutzer-Profile anzeigen
 
tampelritter
Forum-Newbie

Forum-Newbie


Beiträge: 1
Anmeldedatum: 29.12.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.12.2011, 12:23     Titel:
  Antworten mit Zitat      
Hallo

könntest du bitte sagen wie das mit dem STL-Export funktioniert

Danke

Gruß Tobias
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: 01.01.2012, 12:18     Titel:
  Antworten mit Zitat      
Hallo tampelritter,

Es gibt mehrere Methoden in Matlab's FileExchange, also einfach dort suchen:
http://www.mathworks.com/matlabcentral/fileexchange/?term=STL
Gruß, Jan
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 - 2025 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.