Get surface area of region on polydata

I would like to derive the surface area of a specific region on the surface of polydata. This specific region would be the part of the surface that is visible when viewed from above (in the y-plane) such that overlapping “points” are not considered.

This is the isosurface generated by Marching Cubes:

To illustrate, I have derive this particular top-surface by manipulating the original image stack and use MC to reconstruct the isosurface of the manipulated images (in green):

I can now get the surface area via vtkMassProperties().GetSurfaceArea()/2 of the region.

However, the derivation of the green region by manipulating the image data feels very cumbersome. Therefore I was wondering if anybody would know an appropriate method to get the region of a surface that is visible in the y-plane. Perhaps I would need to clip the object by a complex shaped plane?

I hope my question is clear, thanks in advance! :slight_smile:

We have tried a number of different approaches for solving this problem (selecting cells based on their normal direction, medial/Voronoi surface, etc), but what worked the best in the end was the following:

  • Create a curve by automatically placing points around the of the boundary (closest points to points far away from the model in 4-8 directions)
  • Compute path between the control points on the surface using vtkSlicerDijkstraGraphGeodesicPath, minimizing using inverse square of curvature computed by vtkCurvatures filter
  • Extract surface using vtkSelectPolyData

You can try this on your data without any programming by following steps described in this video:

Hi Andras, thank you for your comprehensive reply. I tried both methods, the 3D slicer was working fine but I need to make it automated.

vtkDijkstraGraphGeodesicPath needs a start and end vertex to compute a path. My input however consists of hundreds of vertices describing the (complex) boundaries of my object. Do you know how I could make a closed path between my boundary points using vtkDijkstraGraphGeodesicPath (instead of just between one start and end vertex)?

3D Slicer is fully Python-scriptable, so you can use it without GUI. But if you don’t work in medical imaging domain then it may be not necessary to use Slicer’s Python environment and want to just extract this particular feature. To get this working anywhere, follow the steps that I described above. Maybe the first step was not entirely clear: you get a complete closed curve by creating curves between each pair of the 4-8 control points. You can find control point by finding closest point to the surface from far away from the model, in 4-8 different directions.