2016-03-24 9 views
0

Ich arbeite mit Persistent Homology und ich brauche Cloud-Punkte der üblichen 3D-Formen, um meine Methoden zu testen.Transform 3D zu PointCloud

Das Problem ist, dass ich ein Java-Programmierer bin und Java nicht solche Werkzeuge zur Verfügung stellen, aber ich bin mir ziemlich sicher, dass Matlab tut ... Ich habe versucht, über das Lesen hier:

http://www.mathworks.com/help/vision/ref/pcfitsphere.html 
http://www.mathworks.com/help/matlab/ref/sphere.html 
http://www.mathworks.com/help/vision/ref/pcshow.html#inputarg_ptCloud 

Diese Links Informationen über Spheres und PointClouds bereitstellen, aber ich habe noch nie Matlab programmiert, sodass ich nicht mal Code vorschlagen kann.

Gibt es eine Möglichkeit, eine 3D-Form zu erstellen, die Punktwolke zu erhalten und die Punktwolke auf der Konsole zu drucken? Like:

x0, y0, z0

x1, y1, z1

x2, y2, z2

... Was ich tat, war eine Java-Klasse erstellen, die zufällig gedruckt Punkte, die auf einer Funktion basieren, also zum Beispiel würde ich meinem Programm die Funktion einer Kugel geben ... Aber es wird sehr kompliziert, wenn ich versuche, Funktionen von Pyramiden oder Drei-Torus zu erstellen.

+0

denke ich, der gleiche Ansatz, den Sie in Java versucht, die Art und Weise in Matlab zu gehen sei. – pysolver

+0

Es klingt, als ob Sie nach Gleichungen fragen, die bestimmte 3D-Formen beschreiben? – Amro

Antwort

2

Hier ist ein MATLAB Beispiel points inside a sphere:

% random points in spherical coordinates 
N = 1000; 
theta = 2*pi*rand(N,1); 
phi = asin(2*rand(N,1)-1); 
radii = 3*(rand(N,1).^(1/3)); 

% convert to cartesian 
[x,y,z] = sph2cart(theta, phi, radii); 

% plot 
scatter3(x, y, z, 10, 'filled') 
axis vis3d equal, grid on, box on 
xlabel X, ylabel Y, zlabel Z 

sphere-cloud

Siehe this Referenz.


EDIT

Hier ist ein weiteres Beispiel für die Punkte in einer Pyramide zu erzeugen.

Dieses Mal nehme ich einen Brute-Force-Ansatz, indem ich einfach viele zufällige 3d-Punkte im [0,1] -Würfel erzeuge und sie dann durch testing which points are inside the pyramid convex polyhedron (mit Delaunay-Triangulation) filtere.

% random points 
N = 3000; 
XYZ = rand(N,3); 

% unit pyramid in [0,1] 
V = [0 0 0 ; 
    1 0 0 ; 
    1 1 0 ; 
    0 1 0 ; 
    0.5 0.5 0 ; 
    0.5 0.5 sqrt(2)/2]; 

% delaunay triangulation 
DT = delaunayn(V); 

% determine points within 
in = ~isnan(tsearchn(V, DT, XYZ)); 

% plot 
scatter3(XYZ(in,1), XYZ(in,2), XYZ(in,3), 8, 'filled') 
view(3), axis vis3d equal, grid on, box on 
axis([0 1 0 1 0 1]) 
xlabel X, ylabel Y, zlabel Z 

% overlay pyramid 
hold on 
h = tetramesh(DT, V); 
set(h, 'FaceAlpha',0.1, 'EdgeColor','m', 'FaceColor','m') 
hold off 

pyramid-cloud

+0

WOW! Tolle. Vielen Dank. –

+0

Hey, du hast schon viel gemacht, aber ich würde gerne wissen, ob es eine Möglichkeit gibt, diese Koordinaten zu drucken: x0, y0, z0; x1, y1, z1; ... –

+1

sicher das ist der einfache Teil :) Sie können Funktionen wie ['CSVWRITE'] (http://www.mathworks.com/help/matlab/ref/csvwrite.html) oder [' DLMWRITE'] (http://www.mathworks.com/help/matlab/ref/dlmwrite.html) oder einfach nur "FPRINTF". Für das erste Beispiel: 'csvwrite ('sphere.csv', [xyz])', und für das zweite Beispiel sagen wir: 'dlmwrite ('pyramid.csv', XYZ (in, :), 'precision', '% .9f ') ' – Amro