在MatLab中计算平均曲率时出现意外结果

时间:2019-02-22 05:26:28

标签: matlab mesh

我正在对蛋白质/膜系统进行仿真,并希望量化膜变形的程度。在模拟过程中,我已经将网格上的膜表面平均了,这将导致文本文件包含三列,其中包含膜的x,y和z点。然后,我将此信息转换为matlab中的网格表面,然后将其用于计算高斯和/或平均曲率。问题是,在模拟的一开始,当表面(膜)非常平坦时,到最后,当它完全变形时,我得到了相似的值。除非我误解了曲率是什么,否则这是不正确的,我相信在此过程的matlab部分中我做错了什么。这是我在其中循环播放许多帧的脚本(每个帧都是一个包含平均膜的x,y,z坐标的不同文件),并将其转换为网格:

https://pastebin.com/reqWAz01

for i = 0:37

file = strcat('cg-topmem_pos-', num2str(i), '.out');
A = load(file);
x = A(:,1);
y = A(:,2);
z = A(:,3);

xv = linspace(min(x), max(x), 20);
yv = linspace(min(y), max(y), 20);
[X,Y] = meshgrid(xv, yv);
Z = griddata(x,y,z,X,Y);

[K,H,Pmax,Pmin] = surfature(X,Y,Z);
M = max(max(H))
if i == 0
    fileID = fopen('Average2-NoTMHS-5nmns.txt', 'a');
    fprintf(fileID, '%f %f\n',M);
    fclose(fileID);
else
    fileID = fopen('Average2-NoTMHS-5nmns.txt', 'a');
    fprintf(fileID, '\n%f %f\n',M);
    fclose(fileID);
end

end    

然后使用以下公式计算曲率:

https://pastebin.com/5D21PdBQ

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

任何帮助将不胜感激。恐怕在如何创建网格和如何计算曲率之间会存在一些问题,但是我不是matlab识字的人,可以使用一些帮助。非常感谢。

0 个答案:

没有答案