[vtkusers] Polydata volume calculation problem

Xiaopeng Yang yxp233 at postech.ac.kr
Wed Jan 19 04:29:06 EST 2011


Dear VTK and ITK users,

 

I tried to calculate polydata volume through vtkMassProperties. Firstly, the
polydata was generated from a set of 3D points. Then I applied
vtkSurfaceReconstructionFilter to generate a surface. And then a contour was
generated by vtkContourFilter. After several other steps, I got the volume
by vtkMassProperties.

 

The problem is:

1.       Whether my code is proper to calculate polydata volume?

2.       When I change the SetValue(0, 10) of vtkContourFilter to some value
else, for example, SetValue(0, 20), the calculated volumes under the two
conditions are very different. What value is proper to calculate volume?

3.       What is the correct way to calculate polydata volume?

 

Thanks very much! The following is the code:

 

        for (i = 0; i < spl_max; i++)

              {

                     points->InsertNextPoint(segment_point_list[i][0],
segment_point_list[i][1], segment_point_list[i][2]);

              }

 

        polydata->SetPoints(points);

 

        vtkSurfaceReconstructionFilter *surf =
vtkSurfaceReconstructionFilter::New(); 

        surf->SetInput(polydata); 

 

        vtkContourFilter *contours = vtkContourFilter::New(); 

        contours->SetInputConnection(surf->GetOutputPort()); 

        contours->SetValue(0,10); 

 

        // # Extract boundary edges 

        vtkFeatureEdges *boundary = vtkFeatureEdges::New(); 

        boundary->BoundaryEdgesOn(); 

        boundary->FeatureEdgesOff(); 

        boundary->ManifoldEdgesOff(); 

        boundary->NonManifoldEdgesOff(); 

        boundary->SetInputConnection(contours->GetOutputPort()); 

        

        // # Build a polyline from boundary edges 

        vtkStripper *stripper = vtkStripper::New(); 

        stripper->SetInputConnection(boundary->GetOutputPort()); 

        stripper->Update(); 

        vtkPolyData *holePoly = vtkPolyData::New(); 

        holePoly->SetPoints(stripper->GetOutput()->GetPoints()); 

        holePoly->SetPolys(stripper->GetOutput()->GetLines()); 

        

        // # Triangulate hole 

        vtkTriangleFilter *filler = vtkTriangleFilter::New(); 

        filler->SetInput(holePoly); 

 

        // # Combine into a single polydata 

        vtkAppendPolyData *apd = vtkAppendPolyData::New(); 

        apd->AddInputConnection(contours->GetOutputPort()); 

        apd->AddInputConnection(filler->GetOutputPort()); 

 

        // # Merge duplicate points 

        vtkCleanPolyData *cleaner = vtkCleanPolyData::New(); 

        cleaner->AddInputConnection(apd->GetOutputPort()); 

 

        // # Add normals 

        vtkPolyDataNormals *apdNormals = vtkPolyDataNormals::New(); 

        apdNormals->SetInputConnection(cleaner->GetOutputPort()); 

 

        vtkReverseSense *reverse = vtkReverseSense::New(); 

        reverse->SetInputConnection(apdNormals->GetOutputPort()); 

        reverse->ReverseCellsOn(); 

        reverse->ReverseNormalsOn(); 

 

        vtkTriangleFilter *triangle = vtkTriangleFilter::New(); 

        triangle->SetInputConnection(reverse->GetOutputPort()); 

        

        vtkMassProperties *massProperty = vtkMassProperties::New(); 

        massProperty->SetInputConnection(triangle->GetOutputPort()); 

 

       massProperty->Update();

       double vol = massProperty->GetVolume();

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110119/2cd0ec8b/attachment.htm>


More information about the vtkusers mailing list