<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body text="#003333" bgcolor="#FFFFFF">
<font size="-1"><font face="Tahoma">Hi all,<br>
<br>
I'm trying to use </font></font><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma">vtkBooleanOperationPolyDataFilter
</font></font>but it seems I'm missing something. I get
unexpected result when computing the difference between a simple
sphere and a poledron.<br>
<br>
Can someone explain me what is wrong in the following example ?<br>
<br>
Thanks by advance.<br>
<br>
##############<br>
<br>
#include <vtkSmartPointer.h><br>
#include <vtkSphereSource.h><br>
#include <</font></font><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma">vtkPolyData </font></font>.h><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma">#include <<font size="-1"><font
face="Tahoma">vtkPoints</font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma">.h></font></font><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma">#include
<<font size="-1"><font face="Tahoma">vtkCellArray</font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma">.h></font></font></font></font><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma">#include <<font
size="-1"><font face="Tahoma">vtkIdType</font></font></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma">.h></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma">#include <<font size="-1"><font
face="Tahoma">vtkTriangle</font></font></font></font></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma">.h></font></font></font></font></font></font></font></font><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma">#include <<font size="-1"><font
face="Tahoma">vtkBooleanOperationPolyDataFilter</font></font></font></font></font></font></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma">.h><br>
</font></font></font></font></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma">#include <</font></font></font></font></font></font></font></font></font></font></font></font>vtkRenderer.h><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma">#include <</font></font></font></font></font></font></font></font></font></font></font></font></font></font>vtkPolyDataMapper.h><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma">#include <</font></font></font></font></font></font></font></font></font></font></font></font></font></font>vtkActor.h><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><br>
#include <</font></font></font></font></font></font></font></font></font></font></font></font></font></font></font></font><font
size="-1"><font face="Tahoma">vtkRenderWindow.h><br>
</font></font><font size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font face="Tahoma"><font
size="-1"><font face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma"><font size="-1"><font
face="Tahoma">#include <</font></font></font></font></font></font></font></font></font></font></font></font></font></font>vtkRenderWindowInteractor.h>
</font></font><br>
<font size="-1"><font face="Tahoma"><br>
#include <vector><br>
<br>
int main(int argc, char *argv[])<br>
{<br>
// sphere<br>
vtkSmartPointer<vtkSphereSource> sphereSource1 =
vtkSmartPointer<vtkSphereSource>::New();<br>
sphereSource1->SetCenter(.25, 0, 0);<br>
sphereSource1->Update();<br>
<br>
vtkPolyData * sphere = sphereSource1->GetOutput();<br>
<br>
// design a bloc which intersects the sphere<br>
double bounds[6];<br>
sphere->GetBounds(bounds);<br>
<br>
double x1,x2,y1,y2,z1,z2;<br>
x1=bounds[0];<br>
x2=bounds[1];<br>
y1=bounds[2]-0.5;<br>
y2=bounds[3]+0.5;<br>
z1=bounds[4]-0.5;<br>
z2=bounds[5]+0.5;<br>
<br>
double lx = x2-x1;<br>
<br>
vtkSmartPointer<vtkPolyData> bloc =
vtkSmartPointer<vtkPolyData>::New(); <br>
vtkSmartPointer<vtkPoints> points =
vtkSmartPointer<vtkPoints>::New();<br>
vtkSmartPointer<vtkCellArray> triangles =
vtkSmartPointer<vtkCellArray>::New();<br>
bloc->SetPoints(points);<br>
bloc->SetPolys(triangles);<br>
<br>
vector<vtkIdType> ids;<br>
ids.push_back( points->InsertNextPoint( x1+0.3*lx, y1,
z2));<br>
ids.push_back( points->InsertNextPoint( x1+0.6*lx, y1,
z2));<br>
ids.push_back( points->InsertNextPoint( x1+0.6*lx, y2,
z2));<br>
ids.push_back( points->InsertNextPoint( x1+0.3*lx, y2,
z2));<br>
ids.push_back( points->InsertNextPoint( x1+0.3*lx, y1,
z1));<br>
ids.push_back( points->InsertNextPoint( x1+0.6*lx, y1,
z1));<br>
ids.push_back( points->InsertNextPoint( x1+0.6*lx, y2,
z1));<br>
ids.push_back( points->InsertNextPoint( x1+0.3*lx, y2,
z1));<br>
<br>
vtkSmartPointer<vtkTriangle> t0 =
vtkSmartPointer<vtkTriangle>::New();<br>
t0->GetPointIds()->SetId ( 0, ids[0]);<br>
t0->GetPointIds()->SetId ( 1, ids[1]);<br>
t0->GetPointIds()->SetId ( 2, ids[2]);<br>
triangles->InsertNextCell ( t0 );<br>
vtkSmartPointer<vtkTriangle> t1 =
vtkSmartPointer<vtkTriangle>::New();<br>
t1->GetPointIds()->SetId ( 0, ids[0]);<br>
t1->GetPointIds()->SetId ( 1, ids[2]);<br>
t1->GetPointIds()->SetId ( 2, ids[3]);<br>
triangles->InsertNextCell ( t1 );<br>
vtkSmartPointer<vtkTriangle> t2 =
vtkSmartPointer<vtkTriangle>::New();<br>
t2->GetPointIds()->SetId ( 0, ids[1]);<br>
t2->GetPointIds()->SetId ( 1, ids[5]);<br>
t2->GetPointIds()->SetId ( 2, ids[2]);<br>
triangles->InsertNextCell ( t2 );<br>
vtkSmartPointer<vtkTriangle> t3 =
vtkSmartPointer<vtkTriangle>::New();<br>
t3->GetPointIds()->SetId ( 0, ids[2]);<br>
t3->GetPointIds()->SetId ( 1, ids[5]);<br>
t3->GetPointIds()->SetId ( 2, ids[6]);<br>
triangles->InsertNextCell ( t3 );<br>
vtkSmartPointer<vtkTriangle> t4 =
vtkSmartPointer<vtkTriangle>::New();<br>
t4->GetPointIds()->SetId ( 0, ids[2]);<br>
t4->GetPointIds()->SetId ( 1, ids[6]);<br>
t4->GetPointIds()->SetId ( 2, ids[7]);<br>
triangles->InsertNextCell ( t4 );<br>
vtkSmartPointer<vtkTriangle> t5 =
vtkSmartPointer<vtkTriangle>::New();<br>
t5->GetPointIds()->SetId ( 0, ids[2]);<br>
t5->GetPointIds()->SetId ( 1, ids[7]);<br>
t5->GetPointIds()->SetId ( 2, ids[3]);<br>
triangles->InsertNextCell ( t5 );<br>
vtkSmartPointer<vtkTriangle> t6 =
vtkSmartPointer<vtkTriangle>::New();<br>
t6->GetPointIds()->SetId ( 0, ids[3]);<br>
t6->GetPointIds()->SetId ( 1, ids[7]);<br>
t6->GetPointIds()->SetId ( 2, ids[4]);<br>
triangles->InsertNextCell ( t6 );<br>
vtkSmartPointer<vtkTriangle> t7 =
vtkSmartPointer<vtkTriangle>::New();<br>
t7->GetPointIds()->SetId ( 0, ids[4]);<br>
t7->GetPointIds()->SetId ( 1, ids[3]);<br>
t7->GetPointIds()->SetId ( 2, ids[0]);<br>
triangles->InsertNextCell ( t7 );<br>
vtkSmartPointer<vtkTriangle> t8 =
vtkSmartPointer<vtkTriangle>::New();<br>
t8->GetPointIds()->SetId ( 0, ids[0]);<br>
t8->GetPointIds()->SetId ( 1, ids[4]);<br>
t8->GetPointIds()->SetId ( 2, ids[5]);<br>
triangles->InsertNextCell ( t8 );<br>
vtkSmartPointer<vtkTriangle> t9 =
vtkSmartPointer<vtkTriangle>::New();<br>
t9->GetPointIds()->SetId ( 0, ids[0]);<br>
t9->GetPointIds()->SetId ( 1, ids[1]);<br>
t9->GetPointIds()->SetId ( 2, ids[5]);<br>
triangles->InsertNextCell ( t9);<br>
vtkSmartPointer<vtkTriangle> t10 =
vtkSmartPointer<vtkTriangle>::New();<br>
t10->GetPointIds()->SetId ( 0, ids[6]);<br>
t10->GetPointIds()->SetId ( 1, ids[5]);<br>
t10->GetPointIds()->SetId ( 2, ids[4]);<br>
triangles->InsertNextCell ( t10);<br>
vtkSmartPointer<vtkTriangle> t11 =
vtkSmartPointer<vtkTriangle>::New();<br>
t11->GetPointIds()->SetId ( 0, ids[7]);
t11->GetPointIds()->SetId ( 1, ids[6]);
t11->GetPointIds()->SetId ( 2, ids[4]);<br>
triangles->InsertNextCell ( t11);<br>
<br>
bloc->BuildLinks();<br>
<br>
// boolean filter<br>
vtkSmartPointer<vtkBooleanOperationPolyDataFilter>
booleanOperation =
vtkSmartPointer<vtkBooleanOperationPolyDataFilter>::New();<br>
booleanOperation->SetOperationToDifference();<br>
booleanOperation->SetInputConnection( 1,
sphere->GetProducerPort());<br>
booleanOperation->SetInputConnection( 0,
bloc->GetProducerPort());<br>
booleanOperation->Update();<br>
<br>
//display result<br>
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();<br>
vtkSmartPointer<vtkPolyDataMapper> mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();<br>
mapper->SetInput(booleanOperation->GetOutput());<br>
vtkSmartPointer<vtkActor> actor =
vtkSmartPointer<vtkActor>::New();<br>
actor->SetMapper(mapper);<br>
<br>
renderer->AddActor( actor);<br>
<br>
vtkSmartPointer<vtkRenderWindow> rendWindow =
vtkSmartPointer<vtkRenderWindow>::New();<br>
rendWindow->AddRenderer(renderer);<br>
<br>
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();<br>
iren->SetRenderWindow( rendWindow);<br>
<br>
renderer->ResetCamera();<br>
rendWindow->Render();<br>
iren->Start();<br>
<br>
return 0;<br>
}<br>
<br>
##############<br>
</font></font>
</body>
</html>