Calculate the Mean curvature of a given surface (x,y,z) using vectorized form.
6 Downloads
Updated 22 Mar 2006
No LicenseThis function is a modified form of original code (see below). I vectorized the code to make the code time efficient.
The function calculates the mean curvature of the input structured matrix data. The input are the coordinate matrices of x,y & z (as generated by meshgrid or similar functions).
The outputs are a matrix containing the mean curvature at each point and a scalar giving the surface average mean curvature (SAMC).
Mistake found by Anthony Beaucamp. Thanks for letting me know! File has been updated.
update description |
||
To provide better description of the function |
||
To provide better description of the function |
||
To provide better description of the function |
||
To provide better description of the function |
||
To provide better description of the function |
Inspired by: Mean Curvature
Win cash prizes and have your live script featured on our website
Learn more
Abdelrahman Shaath (view profile)
% 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);
% Initialize Gaussian and mean curvature
K = zeros(size(Z));
H = zeros(size(Z));
% Calculate both Gaussian and mean curvature
for i=1:size(Z,1)
for j=1:size(Z,2)
% assign vector values that we are going to work on
r_u = [Xu(i,j) Yu(i,j) Zu(i,j)];
r_v = [Xv(i,j) Yv(i,j) Zv(i,j)];
r_uu = [Xuu(i,j) Yuu(i,j) Zuu(i,j)];
r_uv = [Xuv(i,j) Yuv(i,j) Zuv(i,j)];
r_vv = [Xvv(i,j) Yvv(i,j) Zvv(i,j)];
% First fundamental Coeffecients of the surface (E,F,G)
E = dot(r_u, r_u);
F = dot(r_u, r_v);
G = dot(r_v, r_v);
% Calculate the unite normal vector (the perpendicular vector for
% both of these vectors)
m = cross(r_u,r_v,2);
n = m./sqrt(dot(m,m,2));
% Second fundamental Coeffecients of the surface (L,M,N)
L = dot(r_uu,n);
M = dot(r_uv,n);
N = dot(r_vv,n);
% Gaussian Curvature
K(i,j) = (L.*N - M.^2)./(E.*G - F.^2);
% Mean Curvature
H(i,j) = (E.*N + G.*L - 2.*F.*M)./(2*(E.*G - F.^2));
end
end
Jose Cappelletto (view profile)
Nadal (view profile)
Hi Claude,
When I run by providing the point cloud data it throws error:
Error using gradient (line 49)
Too many output arguments.
Can you provide a way how should i run for 3D point cloud as an example.
Hi pratik,
Can you please let me know how I can use your code to calculate the curvature of a 2-D curve?
Thanks,Mehdi
@Claude Gouedard:
I acknowledged the original author in my post. I dont think I am responsible for any missing citations on the part of the original author.
(This review might appear twice).
I apologize !
I didn't send my code to you ...
It was to Ahmed Elnagar about "Gaussian Curvature " http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=5229&objectType=file
However ...
this code, yours, sounds a lot like mine. Perhaps there is only one way to program fine ....
It seems I recognize my own code (!) I sent you because I told you that yours was not in the Matlab spirit ...
I don't see any citation ...no thanks ...
File updated to remove error found by Anthony Beaucamp. Thanks for letting me know! Dont know how I missed that! Btw, the original file also has the same error.
That's a big improvement from the original code, but you made a mistake: It's not (2.*(E.*G)-F.^2) but 2.*((E.*G)-F.^2). Anyway, I am working on an extended version that calculates everything: Principal Curvatures, Directions, Mean and Gaussian. I will post it as soon as it's ready.
Cleaned up the help and description. I also compared this code to its predecessor - on a 100x100 grid, I saw a 40x speedup.
(This review may appear twice.)
Thnx for the comments John. I will update the file description. Presently, I am having trouble logging into my account.
That this function does not work on a triangulation does not make it worth deletion. It merely makes it of less value to at least one user than it might be otherwise.
I do have two issues though. First is the claim in the description that it works on a "point cloud". The phrase point cloud suggests an unstructured set of points. This code requires a structured array of data, as meshgrid might have generated. My second comment is a related one - There is very little information supplied in the help to this function, only one vague line. I'd have preferred a much better description of what the inputs must be. Ordinarily I'd have given this file a rating of 2 due to these flaws, but since its already gotten a rating of 1, I chose to round up.
Computing the mean curvature of an implicit surface is very simple and straightforward. The challenging problem is how to efficiently compute the curvatures of a 3D triangle mesh. The most common representation of a 3D surface in computer graphics is the triangle mesh which consists of a set of vertices (geometry) and a set of faces (connectivety).