【问题标题】:Transform 3D to PointCloud将 3D 转换为点云
【发布时间】:2016-03-24 20:15:47
【问题描述】:

我正在使用 Persistent Homology,我需要常见 3D 形状的云点才能测试我的方法。

问题是我是一名 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

这些链接提供有关 Spheres 和 PointClouds 的信息,但我从未在 matlab 上编程,所以我什至无法提出代码。

有没有办法获取 3d 形状,获取点云并在控制台上打印点云? 喜欢:

x0, y0, z0

x1, y1, z1

x2, y2, z2

... 我正在做的是创建一个基于函数打印随机点的Java类,例如,我会给我的程序一个球体的函数......但是当我试图创建金字塔的函数时它变得超级复杂或三环。

【问题讨论】:

  • 我认为您在 Java 中尝试的相同方法将在 Matlab 中采用。
  • 听起来您在询问描述某些 3d 形状的方程式?

标签: matlab 3d shape matlab-cvst point-clouds


【解决方案1】:

这是points inside a sphere 的 MATLAB 示例:

% 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

参考this


编辑

这是在金字塔内生成点的另一个示例。

这一次我采用了一种蛮力方法,简单地在 [0,1] 立方体中生成大量随机 3d 点,然后通过 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

【讨论】:

  • 哇!惊人的。谢谢。
  • 嘿,你已经做了很多,但我想知道是否有办法打印这些坐标,例如:x0、y0、z0; x1,y1,z1; ...
  • 确保这是最简单的部分 :) 您可以使用 CSVWRITEDLMWRITE 之类的函数,或者只是简单的旧 FPRINTF。对于第一个示例:csvwrite('sphere.csv', [x y z]),对于第二个示例,例如:dlmwrite('pyramid.csv', XYZ(in,:), 'precision','%.9f')
  • 不错!最后一件事,我刚刚意识到这些点也在形状内部。我还需要仅在表面上绘制点。这可能吗?
  • 哦,这实际上有点不同。对于球体的情况,您可以通过设置固定半径轻松修改代码,因此将其更改为radii = 3(在提供的链接中对此进行了说明:@ 987654328@)。对于另一种情况,delaunay 三角剖分是行不通的,对不起!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2019-11-19
  • 2021-06-10
  • 2016-09-06
  • 1970-01-01
相关资源
最近更新 更多