[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