<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:10pt"><div><div><font size="2">Hi,</font></div><div><font size="2"><br></font></div><div><font size="2">You simply forgot to compute the normals of your polydata. Use the vtkPolyDataNormals filter on "bloc" in order to do it. It should work.</font></div><div><font size="2"><br></font></div><div><font size="2">Anyway, you should be aware that the vtkBooleanOperationPolyDataFilter has several bugs.&nbsp;</font></div><div><font size="2">You can find information about it on previous threads:</font></div><div><font size="2">http://vtk.1045678.n5.nabble.com/PolyData-Boolean-operation-problem-td5714926.html</font></div><div><font size="2">http://vtk.1045678.n5.nabble.com/Holes-in-mesh-after-vtkBooleanOperationPolyDataFilter-td5713284.html</font></div><div><br></div><div><font size="2">Best</font></div><div><font
 size="2">James</font></div></div>  <div style="font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 10pt; "> <div style="font-family: 'times new roman', 'new york', times, serif; font-size: 12pt; "> <div dir="ltr"> <font size="2" face="Arial"> <hr size="1">  <b><span style="font-weight:bold;">De&nbsp;:</span></b> Cory Quammen &lt;cquammen@cs.unc.edu&gt;<br> <b><span style="font-weight: bold;">À&nbsp;:</span></b> NsPx &lt;nspx.roronoa@gmail.com&gt; <br><b><span style="font-weight: bold;">Cc&nbsp;:</span></b> vtkusers@vtk.org <br> <b><span style="font-weight: bold;">Envoyé le :</span></b> Vendredi 24 août 2012 16h45<br> <b><span style="font-weight: bold;">Objet&nbsp;:</span></b> Re: [vtkusers] wrong result while using vtkBooleanOperationPolyDataFilter<br> </font> </div> <br>Please be more specific about what the problem is. Does the code not<br>compile? Is the result of the boolean operation&nbsp; incorrect?<br><br>Thank
 you,<br>Cory<br><br>On Fri, Aug 24, 2012 at 10:38 AM, NsPx &lt;<a ymailto="mailto:nspx.roronoa@gmail.com" href="mailto:nspx.roronoa@gmail.com">nspx.roronoa@gmail.com</a>&gt; wrote:<br>&gt; Hi all,<br>&gt;<br>&gt; I'm trying to use vtkBooleanOperationPolyDataFilter but it seems I'm missing<br>&gt; something. I get unexpected result when computing the difference between a<br>&gt; simple sphere and a poledron.<br>&gt;<br>&gt; Can someone explain me what is wrong in the following example ?<br>&gt;<br>&gt; Thanks by advance.<br>&gt;<br>&gt; ##############<br>&gt;<br>&gt; #include &lt;vtkSmartPointer.h&gt;<br>&gt; #include &lt;vtkSphereSource.h&gt;<br>&gt; #include &lt;vtkPolyData .h&gt;<br>&gt; #include &lt;vtkPoints.h&gt;<br>&gt; #include &lt;vtkCellArray.h&gt;<br>&gt; #include &lt;vtkIdType.h&gt;<br>&gt; #include &lt;vtkTriangle.h&gt;<br>&gt; #include &lt;vtkBooleanOperationPolyDataFilter.h&gt;<br>&gt; #include &lt;vtkRenderer.h&gt;<br>&gt; #include
 &lt;vtkPolyDataMapper.h&gt;<br>&gt; #include &lt;vtkActor.h&gt;<br>&gt; #include &lt;vtkRenderWindow.h&gt;<br>&gt; #include &lt;vtkRenderWindowInteractor.h&gt;<br>&gt;<br>&gt; #include &lt;vector&gt;<br>&gt;<br>&gt; int main(int argc, char *argv[])<br>&gt; {<br>&gt;&nbsp; &nbsp;  // sphere<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkSphereSource&gt; sphereSource1 =<br>&gt; vtkSmartPointer&lt;vtkSphereSource&gt;::New();<br>&gt;&nbsp; &nbsp;  sphereSource1-&gt;SetCenter(.25, 0, 0);<br>&gt;&nbsp; &nbsp;  sphereSource1-&gt;Update();<br>&gt;<br>&gt;&nbsp; &nbsp;  vtkPolyData * sphere = sphereSource1-&gt;GetOutput();<br>&gt;<br>&gt;&nbsp; &nbsp;  // design a bloc which intersects the sphere<br>&gt;&nbsp; &nbsp;  double bounds[6];<br>&gt;&nbsp; &nbsp;  sphere-&gt;GetBounds(bounds);<br>&gt;<br>&gt;&nbsp; &nbsp;  double x1,x2,y1,y2,z1,z2;<br>&gt;&nbsp; &nbsp;  x1=bounds[0];<br>&gt;&nbsp; &nbsp;  x2=bounds[1];<br>&gt;&nbsp; &nbsp;  y1=bounds[2]-0.5;<br>&gt;&nbsp;
 &nbsp;  y2=bounds[3]+0.5;<br>&gt;&nbsp; &nbsp;  z1=bounds[4]-0.5;<br>&gt;&nbsp; &nbsp;  z2=bounds[5]+0.5;<br>&gt;<br>&gt;&nbsp; &nbsp;  double lx = x2-x1;<br>&gt;<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkPolyData&gt; bloc = vtkSmartPointer&lt;vtkPolyData&gt;::New();<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkPoints&gt; points = vtkSmartPointer&lt;vtkPoints&gt;::New();<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkCellArray&gt; triangles =<br>&gt; vtkSmartPointer&lt;vtkCellArray&gt;::New();<br>&gt;&nbsp; &nbsp;  bloc-&gt;SetPoints(points);<br>&gt;&nbsp; &nbsp;  bloc-&gt;SetPolys(triangles);<br>&gt;<br>&gt;&nbsp; &nbsp;  vector&lt;vtkIdType&gt; ids;<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.3*lx, y1, z2));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.6*lx, y1, z2));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.6*lx, y2, z2));<br>&gt;&nbsp; &nbsp;  ids.push_back(
 points-&gt;InsertNextPoint( x1+0.3*lx, y2, z2));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.3*lx, y1, z1));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.6*lx, y1, z1));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.6*lx, y2, z1));<br>&gt;&nbsp; &nbsp;  ids.push_back( points-&gt;InsertNextPoint( x1+0.3*lx, y2, z1));<br>&gt;<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t0 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t0-&gt;GetPointIds()-&gt;SetId ( 0, ids[0]);<br>&gt;&nbsp; &nbsp;  t0-&gt;GetPointIds()-&gt;SetId ( 1, ids[1]);<br>&gt;&nbsp; &nbsp;  t0-&gt;GetPointIds()-&gt;SetId ( 2, ids[2]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t0 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t1 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t1-&gt;GetPointIds()-&gt;SetId ( 0, ids[0]);<br>&gt;&nbsp; &nbsp; 
 t1-&gt;GetPointIds()-&gt;SetId ( 1, ids[2]);<br>&gt;&nbsp; &nbsp;  t1-&gt;GetPointIds()-&gt;SetId ( 2, ids[3]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t1 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t2 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t2-&gt;GetPointIds()-&gt;SetId ( 0, ids[1]);<br>&gt;&nbsp; &nbsp;  t2-&gt;GetPointIds()-&gt;SetId ( 1, ids[5]);<br>&gt;&nbsp; &nbsp;  t2-&gt;GetPointIds()-&gt;SetId ( 2, ids[2]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t2 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t3 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t3-&gt;GetPointIds()-&gt;SetId ( 0, ids[2]);<br>&gt;&nbsp; &nbsp;  t3-&gt;GetPointIds()-&gt;SetId ( 1, ids[5]);<br>&gt;&nbsp; &nbsp;  t3-&gt;GetPointIds()-&gt;SetId ( 2, ids[6]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t3 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t4 =
 vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t4-&gt;GetPointIds()-&gt;SetId ( 0, ids[2]);<br>&gt;&nbsp; &nbsp;  t4-&gt;GetPointIds()-&gt;SetId ( 1, ids[6]);<br>&gt;&nbsp; &nbsp;  t4-&gt;GetPointIds()-&gt;SetId ( 2, ids[7]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t4 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t5 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t5-&gt;GetPointIds()-&gt;SetId ( 0, ids[2]);<br>&gt;&nbsp; &nbsp;  t5-&gt;GetPointIds()-&gt;SetId ( 1, ids[7]);<br>&gt;&nbsp; &nbsp;  t5-&gt;GetPointIds()-&gt;SetId ( 2, ids[3]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t5 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t6 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t6-&gt;GetPointIds()-&gt;SetId ( 0, ids[3]);<br>&gt;&nbsp; &nbsp;  t6-&gt;GetPointIds()-&gt;SetId ( 1, ids[7]);<br>&gt;&nbsp; &nbsp;  t6-&gt;GetPointIds()-&gt;SetId ( 2,
 ids[4]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t6 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t7 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t7-&gt;GetPointIds()-&gt;SetId ( 0, ids[4]);<br>&gt;&nbsp; &nbsp;  t7-&gt;GetPointIds()-&gt;SetId ( 1, ids[3]);<br>&gt;&nbsp; &nbsp;  t7-&gt;GetPointIds()-&gt;SetId ( 2, ids[0]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t7 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t8 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t8-&gt;GetPointIds()-&gt;SetId ( 0, ids[0]);<br>&gt;&nbsp; &nbsp;  t8-&gt;GetPointIds()-&gt;SetId ( 1, ids[4]);<br>&gt;&nbsp; &nbsp;  t8-&gt;GetPointIds()-&gt;SetId ( 2, ids[5]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t8 );<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t9 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t9-&gt;GetPointIds()-&gt;SetId ( 0,
 ids[0]);<br>&gt;&nbsp; &nbsp;  t9-&gt;GetPointIds()-&gt;SetId ( 1, ids[1]);<br>&gt;&nbsp; &nbsp;  t9-&gt;GetPointIds()-&gt;SetId ( 2, ids[5]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t9);<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t10 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t10-&gt;GetPointIds()-&gt;SetId ( 0, ids[6]);<br>&gt;&nbsp; &nbsp;  t10-&gt;GetPointIds()-&gt;SetId ( 1, ids[5]);<br>&gt;&nbsp; &nbsp;  t10-&gt;GetPointIds()-&gt;SetId ( 2, ids[4]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t10);<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkTriangle&gt; t11 = vtkSmartPointer&lt;vtkTriangle&gt;::New();<br>&gt;&nbsp; &nbsp;  t11-&gt;GetPointIds()-&gt;SetId ( 0, ids[7]); t11-&gt;GetPointIds()-&gt;SetId ( 1,<br>&gt; ids[6]); t11-&gt;GetPointIds()-&gt;SetId ( 2, ids[4]);<br>&gt;&nbsp; &nbsp;  triangles-&gt;InsertNextCell ( t11);<br>&gt;<br>&gt;&nbsp; &nbsp; 
 bloc-&gt;BuildLinks();<br>&gt;<br>&gt;&nbsp; &nbsp;  // boolean filter<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkBooleanOperationPolyDataFilter&gt; booleanOperation =<br>&gt; vtkSmartPointer&lt;vtkBooleanOperationPolyDataFilter&gt;::New();<br>&gt;&nbsp; &nbsp;  booleanOperation-&gt;SetOperationToDifference();<br>&gt;&nbsp; &nbsp;  booleanOperation-&gt;SetInputConnection( 1,&nbsp; sphere-&gt;GetProducerPort());<br>&gt;&nbsp; &nbsp;  booleanOperation-&gt;SetInputConnection( 0,&nbsp; bloc-&gt;GetProducerPort());<br>&gt;&nbsp; &nbsp;  booleanOperation-&gt;Update();<br>&gt;<br>&gt;&nbsp; &nbsp;  //display result<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkRenderer&gt; renderer =<br>&gt; vtkSmartPointer&lt;vtkRenderer&gt;::New();<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkPolyDataMapper&gt; mapper =<br>&gt; vtkSmartPointer&lt;vtkPolyDataMapper&gt;::New();<br>&gt;&nbsp; &nbsp;  mapper-&gt;SetInput(booleanOperation-&gt;GetOutput());<br>&gt;&nbsp; &nbsp; 
 vtkSmartPointer&lt;vtkActor&gt; actor = vtkSmartPointer&lt;vtkActor&gt;::New();<br>&gt;&nbsp; &nbsp;  actor-&gt;SetMapper(mapper);<br>&gt;<br>&gt;&nbsp; &nbsp;  renderer-&gt;AddActor( actor);<br>&gt;<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkRenderWindow&gt; rendWindow =<br>&gt; vtkSmartPointer&lt;vtkRenderWindow&gt;::New();<br>&gt;&nbsp; &nbsp;  rendWindow-&gt;AddRenderer(renderer);<br>&gt;<br>&gt;&nbsp; &nbsp;  vtkSmartPointer&lt;vtkRenderWindowInteractor&gt; iren =<br>&gt; vtkSmartPointer&lt;vtkRenderWindowInteractor&gt;::New();<br>&gt;&nbsp; &nbsp;  iren-&gt;SetRenderWindow( rendWindow);<br>&gt;<br>&gt;&nbsp; &nbsp;  renderer-&gt;ResetCamera();<br>&gt;&nbsp; &nbsp;  rendWindow-&gt;Render();<br>&gt;&nbsp; &nbsp;  iren-&gt;Start();<br>&gt;<br>&gt;&nbsp; &nbsp;  return 0;<br>&gt; }<br>&gt;<br>&gt; ##############<br>&gt;<br>&gt; _______________________________________________<br>&gt; Powered by www.kitware.com<br>&gt;<br>&gt; Visit other Kitware
 open-source projects at<br>&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>&gt;<br>&gt; Please keep messages on-topic and check the VTK FAQ at:<br>&gt; <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br>&gt;<br>&gt; Follow this link to subscribe/unsubscribe:<br>&gt; <a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br>&gt;<br><br><br><br>-- <br>Cory Quammen<br>Research Associate<br>Department of Computer Science<br>The University of North Carolina at Chapel Hill<br>_______________________________________________<br>Powered by www.kitware.com<br><br>Visit other Kitware open-source projects at <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br><br>Please keep messages
 on-topic and check the VTK FAQ at: <a href="http://www.vtk.org/Wiki/VTK_FAQ" target="_blank">http://www.vtk.org/Wiki/VTK_FAQ</a><br><br>Follow this link to subscribe/unsubscribe:<br><a href="http://www.vtk.org/mailman/listinfo/vtkusers" target="_blank">http://www.vtk.org/mailman/listinfo/vtkusers</a><br><br><br> </div> </div>  </div></body></html>