10

我有一个描述 3D 圆柱 ( xx,yy,zz,C) 点云的数据集: 3D点云

我想从这个数据集中制作一个表面图,类似于这个 在此处输入图像描述

为了做到这一点,我认为我可以将分散的数据插入TriScatteredInterp到常规网格上,然后使用以下方法绘制它surf

F = TriScatteredInterp(xx,yy,zz);
max_x = max(xx); min_x = min(xx);
max_y = max(yy); min_y = min(yy);
max_z = max(zz); min_z = min(zz);
xi = min_x:abs(stepSize):max_x;
yi = min_y:abs(stepSize):max_y;
zi = min_z:abs(stepSize):max_z;
[qx,qy] = meshgrid(xi,yi);
qz = F(qx,qy);
F = TriScatteredInterp(xx,yy,C);
qc = F(qx,qy);

figure
surf(qx,qy,qz,qc);
axis image

这对于凸面和凹面物体非常有效,但对于圆柱体则结束: 在此处输入图像描述

任何人都可以帮助我如何实现更好的情节吗?

4

4 回答 4

1

你试过德劳内三角测量吗?

http://www.mathworks.com/help/matlab/ref/delaunay.html

load seamount
tri = delaunay(x,y);
trisurf(tri,x,y,z);

阴谋

还有 TriScatteredInterp

http://www.mathworks.com/help/matlab/ref/triscatteredinterp.html

ti = -2:.25:2;
[qx,qy] = meshgrid(ti,ti);
qz = F(qx,qy);
mesh(qx,qy,qz);
hold on;
plot3(x,y,z,'o');

在此处输入图像描述

于 2012-12-07T20:46:00.240 回答
1

我认为您正在寻找的是凸壳函数。请参阅其文档。

K = convhull(X,Y,Z) 返回点 (X,Y,Z) 的 3-D 凸包,其中 X、Y 和 Z 是列向量。K 是表示凸包边界的三角剖分。K 的大小为 mtri-by-3,其中 mtri 是三角形刻面的数量。也就是说,K 的每一行都是根据点索引定义的三角形。

二维示例

xx = -1:.05:1; yy = abs(sqrt(xx));
[x,y] = pol2cart(xx,yy);
k = convhull(x,y);
plot(x(k),y(k),'r-',x,y,'b+')

在此处输入图像描述

使用 plot 在二维中绘制 convhull 的输出。使用 trisurf 或 trimesh 在 3-D 中绘制 convhull 的输出。

于 2014-02-12T10:45:56.730 回答
0

TriScatteredInterp 适用于拟合 z = f(x,y) 形式的 2D 表面,其中 f 是单值函数。像你一样适合点云是行不通的。

由于您正在处理圆柱体,本质上是一个 2D 表面,如果您转换为极坐标,您仍然可以使用 TriScatterdInterp,例如,将半径拟合为角度和高度的函数——类似于:

% convert to polar coordinates:
theta = atan2(yy,xx);
h = zz;
r = sqrt(xx.^2+yy.^2);

% fit radius as a function of theta and h
RFit = TriScatteredInterp(theta(:),h(:),r(:));

% define interpolation points
stepSize = 0.1;
ti = min(theta):abs(stepSize):max(theta);
hi = min(h):abs(stepSize):max(h);
[qx,qy] = meshgrid(ti,hi);
% find r values at points:
rfit = reshape(RFit(qx(:),qy(:)),size(qx));
% plot
surf(rfit.*cos(qx),rfit.*sin(qx),qy)
于 2012-11-29T19:44:12.497 回答
0

圆柱体是与一条线等距的所有点的集合。所以你知道你的xxyy数据zz有一个共同点,那就是它们都应该与对称线等距。您可以使用它来生成一个新圆柱体(在本例中,对称线取为 z 轴):

% best-fitting radius 
% NOTE: only works if z-axis is cylinder's line of symmetry
R = mean( sqrt(xx.^2+yy.^2) );

% generate some cylinder
[x y z] = cylinder(ones(numel(xx),1));

% adjust z-range and set best-fitting radius
z = z * (max(zz(:))-min(zz(:))) + min(zz(:));
x=x*R;
y=y*R;

% plot cylinder
surf(x,y,z)
于 2012-10-12T19:10:44.927 回答