2017-05-27 377 views
0

我想计算点云中某些点的均值和高斯曲率。 我有x,y,z,它们是坐标并且是1d数组。我想使用下面的代码,但在输入参数中,X,Y和Z是2d数组,我不知道这意味着什么,以及如何计算与它们对应的2d数组。 非常感谢在matlab中计算曲面的曲率

function [K,H,Pmax,Pmin] = surfature(X,Y,Z), 
% SURFATURE - COMPUTE GAUSSIAN AND MEAN CURVATURES OF A SURFACE 
% [K,H] = SURFATURE(X,Y,Z), WHERE X,Y,Z ARE 2D ARRAYS OF POINTS ON THE 
% SURFACE. K AND H ARE THE GAUSSIAN AND MEAN CURVATURES, RESPECTIVELY. 
% SURFATURE RETURNS 2 ADDITIONAL ARGUEMENTS, 
% [K,H,Pmax,Pmin] = SURFATURE(...), WHERE Pmax AND Pmin ARE THE MINIMUM 
% AND MAXIMUM CURVATURES AT EACH POINT, RESPECTIVELY. 


% First Derivatives 
[Xu,Xv] = gradient(X); 
[Yu,Yv] = gradient(Y); 
[Zu,Zv] = gradient(Z); 

% Second Derivatives 
[Xuu,Xuv] = gradient(Xu); 
[Yuu,Yuv] = gradient(Yu); 
[Zuu,Zuv] = gradient(Zu); 

[Xuv,Xvv] = gradient(Xv); 
[Yuv,Yvv] = gradient(Yv); 
[Zuv,Zvv] = gradient(Zv); 

% Reshape 2D Arrays into Vectors 
Xu = Xu(:); Yu = Yu(:); Zu = Zu(:); 
Xv = Xv(:); Yv = Yv(:); Zv = Zv(:); 
Xuu = Xuu(:); Yuu = Yuu(:); Zuu = Zuu(:); 
Xuv = Xuv(:); Yuv = Yuv(:); Zuv = Zuv(:); 
Xvv = Xvv(:); Yvv = Yvv(:); Zvv = Zvv(:); 

Xu   = [Xu Yu Zu]; 
Xv   = [Xv Yv Zv]; 
Xuu   = [Xuu Yuu Zuu]; 
Xuv   = [Xuv Yuv Zuv]; 
Xvv   = [Xvv Yvv Zvv]; 

% First fundamental Coeffecients of the surface (E,F,G) 
E   = dot(Xu,Xu,2); 
F   = dot(Xu,Xv,2); 
G   = dot(Xv,Xv,2); 

m   = cross(Xu,Xv,2); 
p   = sqrt(dot(m,m,2)); 
n   = m./[p p p]; 

% Second fundamental Coeffecients of the surface (L,M,N) 
L   = dot(Xuu,n,2); 
M   = dot(Xuv,n,2); 
N   = dot(Xvv,n,2); 

[s,t] = size(Z); 

% Gaussian Curvature 
K = (L.*N - M.^2)./(E.*G - F.^2); 
K = reshape(K,s,t); 

% Mean Curvature 
H = (E.*N + G.*L - 2.*F.*M)./(2*(E.*G - F.^2)); 
H = reshape(H,s,t); 

% Principal Curvatures 
Pmax = H + sqrt(H.^2 - K); 
Pmin = H - sqrt(H.^2 - K); 

回答

0

你有办法转换你的X,Y,Z数据表面矩阵/二维数组。方式取决于你的数据是什么,如何和什么。

  1. 结构网格数据:

    (i)中。如果你的x,y,z对应一个结构化网格,那么你可以直接得到x,y的唯一值,沿着x和y轴分别给出沿着10(nx,ny)的点数。有了这个(nx,ny),您需要将x,y,z数据分别重塑为矩阵X,Y,Z并使用您的函数。 (ii)。如果你不好吗与重塑,就可以得到分钟最大x的值,Y使自己的电网使用meshgrid和使用的GridData做插值。

  2. 非结构化网格数据:如果你的数据是非结构化/分散,得到分钟最大,使用meshgrid让你的网格,并使用的GridDatascatteredInterpolant做插值。

也有以下链接看看:

https://in.mathworks.com/matlabcentral/fileexchange/56533-xyz2grd

https://in.mathworks.com/matlabcentral/fileexchange/56414-xyz-file-functions