2016-03-24 4 views
0

Я работаю с Persistent Homology, и мне нужны точки облаков обычных трехмерных фигур, чтобы проверить мои методы.Transform 3D to PointCloud

Проблема заключается в том, что я программист Java и Java не предлагает такие инструменты, но я уверен, что Matlab делает ... Я пытался читать об этом здесь:

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 

Эти ссылки предоставить информацию о сферах и PointClouds, но я никогда не программировал на Matlab, поэтому я даже не могу предложить код.

Есть ли способ принять 3D-форму, получить облако точек и распечатать облако точек на консоли? как:

x0, y0, z0

x1, y1, z1

x2, y2, z2

... То, что я делал, было создание класса Java, которая печатала случайным точки, основанные на функции, поэтому, например, я бы дал моей программе функцию сферы ... Но она становится сложнее, когда я пытаюсь создать функции пирамид или трехтонов.

+0

Я думаю, что тот же подход, вы пытались в Java будет путь в Matlab. – pysolver

+0

похоже, что вы просите уравнения, описывающие определенные 3d фигуры? – Amro

ответ

2

Вот пример MATLAB из 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

См this для справки.


РЕДАКТИРОВАТЬ

Вот еще один пример для создания точек внутри пирамиды.

На этот раз я применяю подход грубой силы, просто создавая множество случайных трехмерных точек в кубе [0,1], а затем фильтруя их на testing which points are inside the pyramid convex polyhedron (используя триангуляцию Delaunay).

% 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! Удивительно. Благодарю. –

+0

Эй, вы уже много сделали, но я хотел бы знать, есть ли способ распечатать такие координаты, как: x0, y0, z0; x1, y1, z1; ... –

+1

уверен, что это легкая часть :) Вы можете использовать такие функции, как ['CSVWRITE'] (http://www.mathworks.com/help/matlab/ref/csvwrite.html) или [' DLMWRITE'] (http://www.mathworks.com/help/matlab/ref/dlmwrite.html) или просто старый 'FPRINTF'. Для первого примера: 'csvwrite ('sphere.csv', [xyz])', а для второго примера скажем: 'dlmwrite ('pyramid.csv', XYZ (in, :), 'precision', '% .9f ') ' – Amro

Смежные вопросы