[vtkusers] wrong result while using vtkBooleanOperationPolyDataFilter

Malsoaz James jmalsoaz at yahoo.fr
Fri Aug 24 11:06:25 EDT 2012


Hi,

You simply forgot to compute the normals of your polydata. Use the vtkPolyDataNormals filter on "bloc" in order to do it. It should work.

Anyway, you should be aware that the vtkBooleanOperationPolyDataFilter has several bugs. 
You can find information about it on previous threads:
http://vtk.1045678.n5.nabble.com/PolyData-Boolean-operation-problem-td5714926.html
http://vtk.1045678.n5.nabble.com/Holes-in-mesh-after-vtkBooleanOperationPolyDataFilter-td5713284.html

Best
James

________________________________
 De : Cory Quammen <cquammen at cs.unc.edu>
À : NsPx <nspx.roronoa at gmail.com> 
Cc : vtkusers at vtk.org 
Envoyé le : Vendredi 24 août 2012 16h45
Objet : Re: [vtkusers] wrong result while using vtkBooleanOperationPolyDataFilter
 
Please be more specific about what the problem is. Does the code not
compile? Is the result of the boolean operation  incorrect?

Thank you,
Cory

On Fri, Aug 24, 2012 at 10:38 AM, NsPx <nspx.roronoa at gmail.com> wrote:
> Hi all,
>
> I'm trying to use vtkBooleanOperationPolyDataFilter but it seems I'm missing
> something. I get unexpected result when computing the difference between a
> simple sphere and a poledron.
>
> Can someone explain me what is wrong in the following example ?
>
> Thanks by advance.
>
> ##############
>
> #include <vtkSmartPointer.h>
> #include <vtkSphereSource.h>
> #include <vtkPolyData .h>
> #include <vtkPoints.h>
> #include <vtkCellArray.h>
> #include <vtkIdType.h>
> #include <vtkTriangle.h>
> #include <vtkBooleanOperationPolyDataFilter.h>
> #include <vtkRenderer.h>
> #include <vtkPolyDataMapper.h>
> #include <vtkActor.h>
> #include <vtkRenderWindow.h>
> #include <vtkRenderWindowInteractor.h>
>
> #include <vector>
>
> int main(int argc, char *argv[])
> {
>     // sphere
>     vtkSmartPointer<vtkSphereSource> sphereSource1 =
> vtkSmartPointer<vtkSphereSource>::New();
>     sphereSource1->SetCenter(.25, 0, 0);
>     sphereSource1->Update();
>
>     vtkPolyData * sphere = sphereSource1->GetOutput();
>
>     // design a bloc which intersects the sphere
>     double bounds[6];
>     sphere->GetBounds(bounds);
>
>     double x1,x2,y1,y2,z1,z2;
>     x1=bounds[0];
>     x2=bounds[1];
>     y1=bounds[2]-0.5;
>     y2=bounds[3]+0.5;
>     z1=bounds[4]-0.5;
>     z2=bounds[5]+0.5;
>
>     double lx = x2-x1;
>
>     vtkSmartPointer<vtkPolyData> bloc = vtkSmartPointer<vtkPolyData>::New();
>     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
>     vtkSmartPointer<vtkCellArray> triangles =
> vtkSmartPointer<vtkCellArray>::New();
>     bloc->SetPoints(points);
>     bloc->SetPolys(triangles);
>
>     vector<vtkIdType> ids;
>     ids.push_back( points->InsertNextPoint( x1+0.3*lx, y1, z2));
>     ids.push_back( points->InsertNextPoint( x1+0.6*lx, y1, z2));
>     ids.push_back( points->InsertNextPoint( x1+0.6*lx, y2, z2));
>     ids.push_back( points->InsertNextPoint( x1+0.3*lx, y2, z2));
>     ids.push_back( points->InsertNextPoint( x1+0.3*lx, y1, z1));
>     ids.push_back( points->InsertNextPoint( x1+0.6*lx, y1, z1));
>     ids.push_back( points->InsertNextPoint( x1+0.6*lx, y2, z1));
>     ids.push_back( points->InsertNextPoint( x1+0.3*lx, y2, z1));
>
>     vtkSmartPointer<vtkTriangle> t0 = vtkSmartPointer<vtkTriangle>::New();
>     t0->GetPointIds()->SetId ( 0, ids[0]);
>     t0->GetPointIds()->SetId ( 1, ids[1]);
>     t0->GetPointIds()->SetId ( 2, ids[2]);
>     triangles->InsertNextCell ( t0 );
>     vtkSmartPointer<vtkTriangle> t1 = vtkSmartPointer<vtkTriangle>::New();
>     t1->GetPointIds()->SetId ( 0, ids[0]);
>     t1->GetPointIds()->SetId ( 1, ids[2]);
>     t1->GetPointIds()->SetId ( 2, ids[3]);
>     triangles->InsertNextCell ( t1 );
>     vtkSmartPointer<vtkTriangle> t2 = vtkSmartPointer<vtkTriangle>::New();
>     t2->GetPointIds()->SetId ( 0, ids[1]);
>     t2->GetPointIds()->SetId ( 1, ids[5]);
>     t2->GetPointIds()->SetId ( 2, ids[2]);
>     triangles->InsertNextCell ( t2 );
>     vtkSmartPointer<vtkTriangle> t3 = vtkSmartPointer<vtkTriangle>::New();
>     t3->GetPointIds()->SetId ( 0, ids[2]);
>     t3->GetPointIds()->SetId ( 1, ids[5]);
>     t3->GetPointIds()->SetId ( 2, ids[6]);
>     triangles->InsertNextCell ( t3 );
>     vtkSmartPointer<vtkTriangle> t4 = vtkSmartPointer<vtkTriangle>::New();
>     t4->GetPointIds()->SetId ( 0, ids[2]);
>     t4->GetPointIds()->SetId ( 1, ids[6]);
>     t4->GetPointIds()->SetId ( 2, ids[7]);
>     triangles->InsertNextCell ( t4 );
>     vtkSmartPointer<vtkTriangle> t5 = vtkSmartPointer<vtkTriangle>::New();
>     t5->GetPointIds()->SetId ( 0, ids[2]);
>     t5->GetPointIds()->SetId ( 1, ids[7]);
>     t5->GetPointIds()->SetId ( 2, ids[3]);
>     triangles->InsertNextCell ( t5 );
>     vtkSmartPointer<vtkTriangle> t6 = vtkSmartPointer<vtkTriangle>::New();
>     t6->GetPointIds()->SetId ( 0, ids[3]);
>     t6->GetPointIds()->SetId ( 1, ids[7]);
>     t6->GetPointIds()->SetId ( 2, ids[4]);
>     triangles->InsertNextCell ( t6 );
>     vtkSmartPointer<vtkTriangle> t7 = vtkSmartPointer<vtkTriangle>::New();
>     t7->GetPointIds()->SetId ( 0, ids[4]);
>     t7->GetPointIds()->SetId ( 1, ids[3]);
>     t7->GetPointIds()->SetId ( 2, ids[0]);
>     triangles->InsertNextCell ( t7 );
>     vtkSmartPointer<vtkTriangle> t8 = vtkSmartPointer<vtkTriangle>::New();
>     t8->GetPointIds()->SetId ( 0, ids[0]);
>     t8->GetPointIds()->SetId ( 1, ids[4]);
>     t8->GetPointIds()->SetId ( 2, ids[5]);
>     triangles->InsertNextCell ( t8 );
>     vtkSmartPointer<vtkTriangle> t9 = vtkSmartPointer<vtkTriangle>::New();
>     t9->GetPointIds()->SetId ( 0, ids[0]);
>     t9->GetPointIds()->SetId ( 1, ids[1]);
>     t9->GetPointIds()->SetId ( 2, ids[5]);
>     triangles->InsertNextCell ( t9);
>     vtkSmartPointer<vtkTriangle> t10 = vtkSmartPointer<vtkTriangle>::New();
>     t10->GetPointIds()->SetId ( 0, ids[6]);
>     t10->GetPointIds()->SetId ( 1, ids[5]);
>     t10->GetPointIds()->SetId ( 2, ids[4]);
>     triangles->InsertNextCell ( t10);
>     vtkSmartPointer<vtkTriangle> t11 = vtkSmartPointer<vtkTriangle>::New();
>     t11->GetPointIds()->SetId ( 0, ids[7]); t11->GetPointIds()->SetId ( 1,
> ids[6]); t11->GetPointIds()->SetId ( 2, ids[4]);
>     triangles->InsertNextCell ( t11);
>
>     bloc->BuildLinks();
>
>     // boolean filter
>     vtkSmartPointer<vtkBooleanOperationPolyDataFilter> booleanOperation =
> vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();
>     booleanOperation->SetOperationToDifference();
>     booleanOperation->SetInputConnection( 1,  sphere->GetProducerPort());
>     booleanOperation->SetInputConnection( 0,  bloc->GetProducerPort());
>     booleanOperation->Update();
>
>     //display result
>     vtkSmartPointer<vtkRenderer> renderer =
> vtkSmartPointer<vtkRenderer>::New();
>     vtkSmartPointer<vtkPolyDataMapper> mapper =
> vtkSmartPointer<vtkPolyDataMapper>::New();
>     mapper->SetInput(booleanOperation->GetOutput());
>     vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();
>     actor->SetMapper(mapper);
>
>     renderer->AddActor( actor);
>
>     vtkSmartPointer<vtkRenderWindow> rendWindow =
> vtkSmartPointer<vtkRenderWindow>::New();
>     rendWindow->AddRenderer(renderer);
>
>     vtkSmartPointer<vtkRenderWindowInteractor> iren =
> vtkSmartPointer<vtkRenderWindowInteractor>::New();
>     iren->SetRenderWindow( rendWindow);
>
>     renderer->ResetCamera();
>     rendWindow->Render();
>     iren->Start();
>
>     return 0;
> }
>
> ##############
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>



-- 
Cory Quammen
Research Associate
Department of Computer Science
The University of North Carolina at Chapel Hill
_______________________________________________
Powered by www.kitware.com

Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html

Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ

Follow this link to subscribe/unsubscribe:
http://www.vtk.org/mailman/listinfo/vtkusers
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20120824/3c78e22c/attachment.htm>


More information about the vtkusers mailing list