2017-05-27 2 views
0

Je veux calculer les courbures moyennes et gaussiennes de certains points dans un nuage de points. J'ai x, y, z, qui sont des coordonnées et sont des tableaux 1d. Je veux utiliser le code ci-dessous, mais dans les paramètres d'entrée X, Y et Z sont des tableaux 2d, je ne sais pas ce que cela signifie, et comment je peux calculer les tableaux 2d qui leur correspondent. Merci beaucoupcalculer la courbure de la surface dans 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); 

Répondre

0

Vous avez les moyens de convertir vos x, y, z des données à des matrices de surface/tableaux 2D. Way dépend de, comment et ce que vos données sont.

  1. données de grille structurée:

    (i). Si votre x, y, z correspond à une grille structurée, alors vous pouvez directement obtenir uniques valeurs de x, y qui donne le nombre de points le long des axes x et y, respectivement (nx, ny). Avec ce (nx, ny) , vous devez remodeler les données x, y, z respectivement dans les matrices X, Y, Z et utilisez votre fonction.

    (ii). Si vous n'êtes pas d'accord avec remodelant, vous pouvez obtenir min et max valeurs de x, y faire votre propre grille à l'aide meshgrid et faire interpolation à l'aide gridData.

  2. données de la grille Unstructured: Si vos données sont non structurées/dispersés, se min et max, faites votre grille à l'aide meshgrid et faire interpolation à l'aide gridData, scatteredInterpolant.

ont également un coup d'œil dans les liens suivants:

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

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