2017-05-27 102 views
0

ポイントクラウドのいくつかの点の平均とガウス曲率を計算したいと思います。 私はx、y、zを座標とし、1次元配列です。私は以下のコードを使用したいが、入力パラメータでは、X、Y、Zは2次元配列で、何を意味するのか分からず、それらに対応する2次元配列をどのように計算できるのか分からない。 どうもありがとう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

あなたが行列/ 2Dアレイを表面にあなたのx、y、zのデータを変換する方法を持っています。方法は、データがどのように、どのように、どのようなものであるかによって異なります。

  1. 構造格子データ:

    (I)。あなたのx、y、zが構造化されたグリッドに対応しているならば、のユニークなの値をx、y軸に沿った点の数をそれぞれ(nx、ny)に与えます。この(nx、ny)の場合、x、y、zデータをそれぞれ行列X、Y、Zに変更して関数を使用する必要があります。 (ii)。0123。あなたが再形成と大丈夫でない場合、あなたは最大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

はまた、以下のリンクで見て