[vtkusers] Bug in vtkStripper on a very simple case ?
pof
jd379252 at gmail.com
Sun Dec 9 14:16:43 EST 2012
Hi all,
I get a strange result (which may be a bug) using vtk stripper, i.e. it
does not merge LINES as polylines as it is expected to.
In this example (see below an extract of the polydata produced by
vtkStripper), only 2 polylines should be obtained, but vtkStripper
forgot to merge the first and the third line together, though they
obviously share point with Id=0 (btw, the fact that only Id 0 remains
unmerged might not be pure luck).
LINES 3 24
9 0 1 2 3 4 5 19 6 7
10 9 8 17 13 12 15 14 11 10 16
2 18 0
Does anybody have an idea or an explanation?
Thanks
JD
PS: Here below is the complete source file that generates these data and
in which vtkStripper is used.
//////////////////////////////////////////////////////
// Example modified from IntersectionPolyDataFilter.cxx
//////////////////////////////////////////////////////
#include <vtkActor.h>
#include <vtkIntersectionPolyDataFilter.h>
#include <vtkPolyDataMapper.h>
#include <vtkPolyDataWriter.h>
#include <vtkProperty.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>
#include <vtkCellArray.h>
#include <vtkStripper.h>
int main(int argc, char *argv[])
{
vtkSmartPointer<vtkSphereSource> sphereSource1 =
vtkSmartPointer<vtkSphereSource>::New();
sphereSource1->SetCenter(0.0, 0.0, 0.0);
sphereSource1->SetRadius(2.0f);
sphereSource1->SetPhiResolution(20);
sphereSource1->SetThetaResolution(20);
sphereSource1->Update();
vtkSmartPointer<vtkPolyDataMapper> sphere1Mapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
sphere1Mapper->SetInputConnection( sphereSource1->GetOutputPort() );
sphere1Mapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> sphere1Actor =
vtkSmartPointer<vtkActor>::New();
sphere1Actor->SetMapper( sphere1Mapper );
sphere1Actor->GetProperty()->SetOpacity(.3);
sphere1Actor->GetProperty()->SetColor(1,0,0);
/////////////////////////
// BEGIN MODIFICATIONS //
/////////////////////////
// Create a planar object
// Define 4 vertices
vtkSmartPointer<vtkPoints> PlanePoints =
vtkSmartPointer<vtkPoints>::New();
vtkSmartPointer<vtkCellArray> PlaneCells =
vtkSmartPointer<vtkCellArray>::New();
PlanePoints->InsertNextPoint(-3, -1, 0);
PlanePoints->InsertNextPoint(3, -1, 0);
PlanePoints->InsertNextPoint(-3, 1, 0);
PlanePoints->InsertNextPoint(3, 1, 0);
// Create 2 trianglar faces
PlaneCells->InsertNextCell(3);
PlaneCells->InsertCellPoint(0);
PlaneCells->InsertCellPoint(1);
PlaneCells->InsertCellPoint(2);
PlaneCells->InsertNextCell(3);
PlaneCells->InsertCellPoint(1);
PlaneCells->InsertCellPoint(3);
PlaneCells->InsertCellPoint(2);
// Create the polydata from points and faces
vtkSmartPointer<vtkPolyData> ProtectionWall =
vtkSmartPointer<vtkPolyData>::New();
ProtectionWall->SetPoints(PlanePoints);
ProtectionWall->SetPolys(PlaneCells);
/////////////////////////
// END MODIFICATIONS //
/////////////////////////
vtkSmartPointer<vtkPolyDataMapper> planeMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
planeMapper->SetInputConnection( ProtectionWall->GetProducerPort() );
planeMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> planeActor = vtkSmartPointer<vtkActor>::New();
planeActor->SetMapper( planeMapper );
planeActor->GetProperty()->SetOpacity(.3);
planeActor->GetProperty()->SetColor(0,1,0);
// Get intersection segments (LINES) using the
vtkIntersectionPolyDataFilter
vtkSmartPointer<vtkIntersectionPolyDataFilter>
intersectionPolyDataFilter =
vtkSmartPointer<vtkIntersectionPolyDataFilter>::New();
intersectionPolyDataFilter->SplitFirstOutputOff();
intersectionPolyDataFilter->SplitSecondOutputOff();
intersectionPolyDataFilter->SetInputConnection( 0,
sphereSource1->GetOutputPort() );
intersectionPolyDataFilter->SetInputConnection( 1,
ProtectionWall->GetProducerPort() );
intersectionPolyDataFilter->Update();
/////////////////////////
// BEGIN MODIFICATIONS //
/////////////////////////
// Try to get the polylines (there should be 2) from the segments (LINES)
vtkSmartPointer<vtkStripper> stripper =
vtkSmartPointer<vtkStripper>::New();
stripper->SetInputConnection(intersectionPolyDataFilter->GetOutputPort());
stripper->Update();
// Save resulting polydata on a file, in which we see that there are
3 polylines (actually the second polyline is ok,
// but the first and third polylines should have been further merged
vtkSmartPointer<vtkPolyDataWriter> wr =
vtkSmartPointer<vtkPolyDataWriter>::New();
wr->SetFileName("polylines.txt");
wr->SetInputConnection(stripper->GetOutputPort());
wr->Write();
///////////////////////
// END MODIFICATIONS //
///////////////////////
vtkSmartPointer<vtkPolyDataMapper> intersectionMapper =
vtkSmartPointer<vtkPolyDataMapper>::New();
intersectionMapper->SetInputConnection( stripper->GetOutputPort() );
intersectionMapper->ScalarVisibilityOff();
vtkSmartPointer<vtkActor> intersectionActor =
vtkSmartPointer<vtkActor>::New();
intersectionActor->SetMapper( intersectionMapper );
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddViewProp(sphere1Actor);
renderer->AddViewProp(planeActor);
renderer->AddViewProp(intersectionActor);
vtkSmartPointer<vtkRenderWindow> renderWindow =
vtkSmartPointer<vtkRenderWindow>::New();
renderWindow->AddRenderer( renderer );
vtkSmartPointer<vtkRenderWindowInteractor> renWinInteractor =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
renWinInteractor->SetRenderWindow( renderWindow );
renderWindow->Render();
renderWindow->SetSize(600, 600);
renderer->SetBackground(0.1, 0.2, 0.4);
renWinInteractor->Start();
return EXIT_SUCCESS;
}
More information about the vtkusers
mailing list