[vtkusers] Bug in vtkStripper on a very simple case ?

David Gobbi david.gobbi at gmail.com
Sun Dec 9 15:05:30 EST 2012


Hi JD,

It could only merge those two lines if it joined them with a "T".
A polyline cannot have any branches.

 - David


On Sun, Dec 9, 2012 at 12:16 PM, pof <jd379252 at gmail.com> wrote:
> 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