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

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');

ここに画像の説明を入力してください

于 2012-12-07T20:46:00.240 に答える
1

あなたが探しているのは凸包関数だと思います。そのドキュメントを参照してください。

K = convhull(X,Y,Z) は、点 (X,Y,Z) の 3 次元凸包を返します。ここで、X、Y、および Z は列ベクトルです。K は、凸包の境界を表す三角形分割です。K のサイズは mtri 行 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+')

ここに画像の説明を入力

plot を使用して、convhull の出力を 2 次元でプロットします。trisurf または trimesh を使用して、convhull の出力を 3 次元でプロットします。

于 2014-02-12T10:45:56.730 に答える
0

円柱は、線から等距離にあるすべての点の集合です。つまりxx、データyyzzデータには共通点が1つあります。つまり、それらはすべて対称線から等距離にある必要があります。これを使用して、新しい円柱を生成できます(この例では対称線を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 に答える
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 に答える