[vtkusers] Bug in vtkStripper on a very simple case ?
pof
jd379252 at gmail.com
Sun Dec 9 16:48:40 EST 2012
yes this is the way LINES objects are written on vtk files.
Ok, so I understand now the point you were making about the "T", which
was uncorrect.
So back to the problem, why this vtkStripper is not able to merge those
2 lines?
Le 09/12/2012 21:41, David Gobbi a écrit :
> 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