Is there a MATLAB function that can compute the area of my patch?
    15 views (last 30 days)
  
       Show older comments
    
    MathWorks Support Team
    
 on 8 Feb 2012
  
    
    
    
    
    Edited: MathWorks Support Team
    
 on 29 Aug 2019
            I use the ISOSURFACE function to generate a patch object:
[x,y,z,v] = flow;
p = patch(isosurface(x,y,z,v,-3));
isonormals(x,y,z,v,p)
set(p,'FaceColor','red','EdgeColor','none');
daspect([1 1 1])
view(3); 
camlight 
lighting gouraud
I would like to find the area of the patch "p".
Accepted Answer
  MathWorks Support Team
    
 on 29 Aug 2019
        
      Edited: MathWorks Support Team
    
 on 29 Aug 2019
  
      There is no function which directly calculates the surface area of a patch object in MATLAB, however the calculations can be done in a fairly straightforward way using the 'Faces' and 'Vertices' properties of the patch object.
The surface area of the entire patch is then the sum of the areas of all the patch faces. The area of each triangular face can be computed with a cross product. Here is an example:
[x,y,z,v] = flow;
p = patch(isosurface(x,y,z,v,-3));
isonormals(x,y,z,v,p)
set(p,'FaceColor','red','EdgeColor','none');
daspect([1 1 1])
view(3); 
camlight 
lighting gouraud
verts = get(p, 'Vertices');
faces = get(p, 'Faces');
a = verts(faces(:, 2), :) - verts(faces(:, 1), :);
b = verts(faces(:, 3), :) - verts(faces(:, 1), :);
c = cross(a, b, 2);
area = 1/2 * sum(sqrt(sum(c.^2, 2)));
fprintf('\nThe surface area is %f\n\n', area);
If the patch object is constructed with faces that are not triangular (for example, they are rectangular), then each face can be broken down into triangular pieces (a rectangular face can be thought of as two triangular faces).
1 Comment
  Rik
      
      
 on 3 Nov 2016
				You should rescale your coordinates from voxels to millimeter. As only the 'verts' vector contains coordinates, you only have to change that one.
So in your case the code below should give you the area in square mm (area will never be in cubic mm, if you are looking for volume, try meshVolume by David Legland):
conversionMatrix=repmat([0.42 0.42 0.25],[length(verts) 1]);
verts_mm=verts.*conversionMatrix;
a = verts(faces(:, 2), :) - verts(faces(:, 1), :);
b = verts(faces(:, 3), :) - verts(faces(:, 1), :);
c = cross(a, b, 2);
area = 1/2 * sum(sqrt(sum(c.^2, 2)));
fprintf('\nThe surface area is %f\n\n', area);
More Answers (0)
Categories
				Find more on Volume Visualization in Help Center and File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
