<html><body><div style="color:#000; background-color:#fff; font-family:Courier New, courier, monaco, monospace, sans-serif;font-size:10pt"><div id="yiv1206667391"><div><div style="background-color: rgb(255, 255, 255); font-family: 'Courier New', courier, monaco, monospace, sans-serif; "><div id="yiv1206667391yui_3_2_0_17_134328551769850"><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">Hi Kenichiro,</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">We are several VTK users experiencing similar problems. The vtkBooleanOperationPolyDataFilter class works great in most cases. Unfortunately, you should be aware that in some other cases, the algorithm presents several limitations (especially with simple geometrical surfaces).&nbsp;</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div
 id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">In your case, some triangles of your input meshes are coplanar. Unfortunately, coplanar intersections are not currently handled. To solve this, I have implemented my own version of boolean operations for basic geometrical objects based on the Javascript source code found here: http://evanw.github.com/csg.js/. It uses the CSG algorithm and it works perfectly for cube, cylinder, sphere and cone. Another solution could be to rotate your cylinder to avoid coplanar surfaces.</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">Another bug, you should be aware of, produces holes in resulting mesh. You can see enclosed several images showing this problem. After some researches, I have been able to find that the error comes from the vtkImplicitPolyDataDistance class. Indeed, some points are
 classified inside the second mesh while they are not because of the sign found for the distance between the input mesh and the point. This induces errors in the vtkDistancePolyDataFilter. I'm still working on this to find a solution as soon as possible. One solution could be to use another algorithm to find whether a point is inside or outside a mesh (for example using ray casting) but I guess, it could increase the computation time. Thus, currently, I'm checking the current algorithm based on the angle weighted pseudo-normal.</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">Anyway, regarding my needs, these problems make the vtkBooleanOperationPolyDataFilter class (as it is now) unusable in my software (I need a high percent of positive result). A good news is that the main developer (Cory Quammen) plans to debug these classes as soon as he
 finds time to do it. Because I can't move forward without the boolean operations on mesh, I will pursue to work on these VTK classes for few days. If I fail, I will move to another implementation such as the Carve library.</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">For more reading, you should look at previous threads in the VTK mailing list, such as:</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">http://vtk.1045678.n5.nabble.com/Holes-in-mesh-after-vtkBooleanOperationPolyDataFilter-td5713284.html</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">http://vtk.1045678.n5.nabble.com/Non-manifold-triangles-after-running-vtkBooleanOperationPolydataFilter-td5713964.html</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2"><br></font></div><div
 id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">Best</font></div><div id="yiv1206667391yui_3_2_0_17_134328551769850"><font size="2">James</font></div><div style="color: rgb(0, 0, 0); font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 10pt; "><br></div></div><div style="color: rgb(0, 0, 0); font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 10pt; "><br id="yiv1206667391yui_3_2_0_17_134328551769853"></div>  <div style="color: rgb(0, 0, 0); font-family: 'Courier New', courier, monaco, monospace, sans-serif; font-size: 10pt; " id="yiv1206667391yui_3_2_0_17_134328551769858" class="yiv1206667391yui_3_2_0_17_134328551769856"> <div style="font-family: 'times new roman', 'new york', times, serif; font-size: 12pt; " class="yiv1206667391yui_3_2_0_17_134328551769863"> <div dir="ltr"> <font size="2" face="Arial"> <hr size="1">  <b><span style="font-weight:bold;">De&nbsp;:</span></b> kenichiro
 yoshimi &lt;rccm.kyoshimi@gmail.com&gt;<br> <b><span style="font-weight:bold;">À&nbsp;:</span></b> vtkusers@vtk.org <br> <b><span style="font-weight:bold;">Envoyé le :</span></b> Jeudi 26 juillet 2012 3h34<br> <b><span style="font-weight:bold;">Objet&nbsp;:</span></b> [vtkusers] PolyData Boolean operation problem<br> </font> </div> <br>Hi all,<br><br>I try Boolean Operations for a box and a cylinder which are Poly Data<br>Set referring to the example:<br><a rel="nofollow" target="_blank" href="http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/BooleanOperationPolyDataFilter">http://www.vtk.org/Wiki/VTK/Examples/Cxx/PolyData/BooleanOperationPolyDataFilter</a><br><br>But, I have some of results which are the lack of&nbsp; polygons as they<br>should be. My source code is the following, and it's output<br>"union5.000000.vtp" has the problem that some of polygons in<br>cylinder's surface are eliminated.<br><br>---------------------------<br>#include
 &lt;vtkBooleanOperationPolyDataFilter.h&gt;<br>#include &lt;vtkCubeSource.h&gt;<br>#include &lt;vtkCylinderSource.h&gt;<br>#include &lt;vtkSmartPointer.h&gt;<br>#include &lt;vtkTriangleFilter.h&gt;<br>#include &lt;vtkXMLPolyDataWriter.h&gt;<br><br>enum<br>{<br>&nbsp; UNION,<br>&nbsp; INTERSECTION,<br>&nbsp; DIFFERENCE<br>};<br><br>int ExportBooleanOperation(double cyl_x, int operation)<br>{<br>&nbsp; std::string outfilename = "";<br><br>&nbsp; vtkSmartPointer&lt;vtkCubeSource&gt; box =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkCubeSource&gt;::New();<br>&nbsp;
 box-&gt;SetXLength(10.0);<br>&nbsp; box-&gt;SetYLength(1.0);<br>&nbsp; box-&gt;SetZLength(10.0);<br><br>&nbsp; vtkSmartPointer&lt;vtkTriangleFilter&gt; boxTri =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkTriangleFilter&gt;::New();<br>&nbsp; boxTri-&gt;SetInput(box-&gt;GetOutput());<br><br>&nbsp; vtkSmartPointer&lt;vtkCylinderSource&gt; cyl =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkCylinderSource&gt;::New();<br>&nbsp; cyl-&gt;SetResolution(50);<br>&nbsp; cyl-&gt;SetHeight(5.0);<br>&nbsp; cyl-&gt;SetRadius(0.5);<br>&nbsp; cyl-&gt;SetCenter(cyl_x, 0, 0.0);<br><br>&nbsp; vtkSmartPointer&lt;vtkTriangleFilter&gt; cylTri =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkTriangleFilter&gt;::New();<br>&nbsp; cylTri-&gt;SetInput(cyl-&gt;GetOutput());<br><br>&nbsp; vtkSmartPointer&lt;vtkBooleanOperationPolyDataFilter&gt; booleanOperation =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkBooleanOperationPolyDataFilter&gt;::New();<br>&nbsp;
 booleanOperation-&gt;SetInputConnection(0,<br>boxTri-&gt;GetOutput()-&gt;GetProducerPort());<br>&nbsp; booleanOperation-&gt;SetInputConnection(1,<br>cylTri-&gt;GetOutput()-&gt;GetProducerPort());<br><br>&nbsp; if (operation == UNION)<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; booleanOperation-&gt;SetOperationToUnion();<br>&nbsp; &nbsp; outfilename = "union";<br>&nbsp; &nbsp; }<br>&nbsp; else if (operation == INTERSECTION)<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; booleanOperation-&gt;SetOperationToIntersection();<br>&nbsp; &nbsp; outfilename = "intersection";<br>&nbsp; &nbsp; }<br>&nbsp; else if (operation == DIFFERENCE)<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; booleanOperation-&gt;SetOperationToDifference();<br>&nbsp; &nbsp; outfilename = "difference";<br>&nbsp; &nbsp; }<br>&nbsp; else<br>&nbsp; &nbsp; {<br>&nbsp; &nbsp; std::cout &lt;&lt; "Unknown operation: " &lt;&lt; operation &lt;&lt; std::endl;<br>&nbsp; &nbsp; return EXIT_FAILURE;<br>&nbsp; &nbsp; }<br><br>&nbsp;
 char extension[64];<br>&nbsp; sprintf(extension, "%f.vtp", cyl_x);<br>&nbsp; outfilename += extension;<br>&nbsp; vtkSmartPointer&lt;vtkXMLPolyDataWriter&gt; writer =<br>&nbsp; &nbsp; vtkSmartPointer&lt;vtkXMLPolyDataWriter&gt;::New();<br>&nbsp; writer-&gt;SetFileName(outfilename.c_str());<br>&nbsp; writer-&gt;SetInput(booleanOperation-&gt;GetOutput(0));<br>&nbsp; writer-&gt;Write();<br><br>&nbsp; return EXIT_SUCCESS;<br>}<br><br>int main(int argc, char* argv[])<br>{<br>&nbsp; ExportBooleanOperation(0.0, UNION);<br>&nbsp; ExportBooleanOperation(0.0, DIFFERENCE);<br>&nbsp; ExportBooleanOperation(5.0, UNION);<br>&nbsp; ExportBooleanOperation(5.0, DIFFERENCE);<br><br>&nbsp; return EXIT_SUCCESS;<br>}<br>---------------------------<br><br>Would anyone please let me know how to fix.<br><br>Thanks,<br>yoshimi<br>_______________________________________________<br>Powered by www.kitware.com<br><br>Visit other Kitware open-source projects at <a rel="nofollow"
 target="_blank" href="http://www.kitware.com/opensource/opensource.html">http://www.kitware.com/opensource/opensource.html</a><br><br>Please keep messages on-topic and check the VTK FAQ at: <a rel="nofollow" target="_blank" href="http://www.vtk.org/Wiki/VTK_FAQ">http://www.vtk.org/Wiki/VTK_FAQ</a><br><br>Follow this link to subscribe/unsubscribe:<br><a rel="nofollow" target="_blank" href="http://www.vtk.org/mailman/listinfo/vtkusers">http://www.vtk.org/mailman/listinfo/vtkusers</a><br><br><br> </div> </div>  </div></div></div></div></body></html>