我有一个描述3D圆柱点(xx,yy,zz,C
)的点云的数据集:
我想从这个数据集制作一个表面图,类似于此
为了做到这一点,我想我可以使用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
这对于凸面和凹面的物体非常有效,但对于圆柱体则以此结束:
有人可以帮助我如何实现更好的情节吗?
答案 0 :(得分:1)
你尝试过Delaunay三角测量吗?
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');
答案 1 :(得分:1)
我认为你所追求的是Convex hull功能。请参阅其文档。
K = convhull(X,Y,Z)返回点(X,Y,Z)的三维凸包, 其中X,Y和Z是列向量。 K是三角测量 表示凸包的边界。 K的大小为mtri-by-3, 其中mtri是三角面的数量。也就是说,K的每一行 是一个用点指数定义的三角形。
2D中的示例
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+')
使用绘图绘制2-D中的convhull输出。使用trisurf或trimesh在3-D中绘制convhull的输出。
答案 2 :(得分:0)
圆柱体是与线条等距的所有点的集合。所以你知道你的xx
,yy
和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)
答案 3 :(得分: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)