[vtkusers] Bug in vtkStripper on a very simple case ?
David Gobbi
david.gobbi at gmail.com
Sun Dec 9 15:41:17 EST 2012
Is it? Maybe it is. When you wrote the numbers, I assumed that
all of the numbers that you listed were just point indices.
On Sun, Dec 9, 2012 at 1:37 PM, pof <jd379252 at gmail.com> wrote:
> Hum I see.
> (from what I understand), the first integer of each line is simply the
> number of points of the corresponding LINE
>
> Le 09/12/2012 21:33, David Gobbi a écrit :
>
>> Then where would the "9" go?
>>
>> The stripper uses a simple algorithm, it just chooses a starting
>> point, goes as far as it can in each direction to create the first
>> polyline, and then repeats this procedure until all the line segments
>> are accounted for. It doesn't exhaustively search though all
>> permutations to see which one gives the smallest number of output
>> polylines... that would cause the algorithm to run many times slower.
>>
>>
>>
>>
>> On Sun, Dec 9, 2012 at 1:12 PM, pof <jd379252 at gmail.com> wrote:
>>>
>>> Hi David
>>>
>>> the first polyline being:
>>>
>>> 9 0 1 2 3 4 5 19 6 7
>>> and the third polyline (actually it is a segment) being:
>>> 2 18 0
>>> I don't see why they shoud not merge together as (unless I misunderstand
>>> something):
>>> 10 18 0 1 2 3 4 5 19 6 7
>>>
>>> Am I wrong?
>>>
>>>
>>> Le 09/12/2012 21:05, David Gobbi a écrit :
>>>
>>>> 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