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

Goodwin Lawlor goodwin.lawlor.lists at gmail.com
Fri Dec 21 13:19:46 EST 2012


As you saw, it's been through the bug tracker before... perhaps it was
decided that the extra overhead wasn't worth solving what is probably an
edge case for most people.

This time around you could add a flag to the class to do the extra "joining
up", but set the default to the old behaviour.

You could push a branch to Gerrit for review.
http://www.vtk.org/Wiki/VTK/Git/Develop

Goodwin



On Fri, Dec 21, 2012 at 9:56 PM, pof <jd379252 at gmail.com> wrote:

>  It could be worth including this patch in the next vtk release, don't
> you think?
> Maybe some people from Kitware have an opinion on this.
> JD
>
> Le 21/12/2012 18:39, Goodwin Lawlor a écrit :
>
> That's great. Best of luck with your project.
>
>  Goodwin
>
> On Thu, Dec 20, 2012 at 10:11 PM, pof <jd379252 at gmail.com> wrote:
>
>>  Goodwin,
>> this is strange... I tried yesterday and I found it did not work (I must
>> have done something with my testing).
>> I tested again, and this works.
>> Great and thanks
>> JD
>>
>> Le 20/12/2012 17:05, Goodwin Lawlor a écrit :
>>
>> JD,
>>
>>  Pass the final polyline through vtkCleanPolyData with 0.0 tolerance
>> (the default) and it should remove the coincident points.
>>
>>  hth
>>
>>  Goodwin
>>
>> On Thu, Dec 20, 2012 at 12:42 AM, pof <jd379252 at gmail.com> wrote:
>>
>>>  Goodwin,
>>>
>>> I tested the patch on the following simple case (5 segments)
>>> # vtk DataFile Version 3.0
>>> vtk output
>>> ASCII
>>> DATASET POLYDATA
>>> POINTS 6 float
>>> 1.7 0.5 0 2 0 0 1.7 -0.5 0
>>> 1.6 -1 0 1.8 -0.2 0 1.6 1 0
>>> LINES 5 15
>>> 2 0 1
>>> 2 2 3
>>> 2 4 2
>>> 2 1 4
>>> 2 5 0
>>>
>>> without the patch, 2 polylines are obtained from the vtkStripper
>>> LINES 2 9
>>> 5 0 1 4 2 3
>>> 2 5 0
>>>
>>> whereas with the patch a single polyline is obained
>>> LINES 1 8
>>> 7 5 0 0 1 4 2 3
>>>
>>> Things are of course better, though a duplicate of one point (point 0 in
>>> this case) is obtained, which should obviously have been avoided.
>>> So it looks there's stil some space to improve the patch.
>>>
>>> In any case, I thank you for sharing this information with me.
>>> JD
>>>
>>>
>>> Le 19/12/2012 10:04, Goodwin Lawlor a écrit :
>>>
>>> I think vtkStripper was originally written to quickly produce
>>> vtkTriangleStrip/vtkPolyLine primitives that would render faster, not a
>>> computational geometry type class that would produce the longest possible
>>> polylines... it is a visualization library after all.
>>>
>>>  The seed point is arbitrary so you may not get the outcome you were
>>> looking for.
>>>
>>>  See this 2002 post, that contains a patch which may help:
>>> http://vtk.org/pipermail/vtkusers/2002-January/009372.html
>>>
>>>  There was a bug report too:
>>> http://www.vtk.org/Bug/print_bug_page.php?bug_id=832
>>>
>>>  hth
>>>
>>>  Goodwin
>>>
>>>
>>> On Mon, Dec 10, 2012 at 2:51 AM, David Gobbi <david.gobbi at gmail.com>wrote:
>>>
>>>> Insert vtkTriangleFilter before vtkStripper.  This will break any
>>>> input polylines into line segments.  I don't know if it will help,
>>>> but it might.
>>>>
>>>>  - David
>>>>
>>>> On Sun, Dec 9, 2012 at 2:48 PM, pof <jd379252 at gmail.com> wrote:
>>>> > 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;
>>>> >>>>>>> }
>>>> >>>>>
>>>> >>>>>
>>>> >
>>>> _______________________________________________
>>>> Powered by www.kitware.com
>>>>
>>>> Visit other Kitware open-source projects at
>>>> http://www.kitware.com/opensource/opensource.html
>>>>
>>>> Please keep messages on-topic and check the VTK FAQ at:
>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>
>>>
>>>
>>>
>>
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20121221/32bc3c99/attachment.htm>


More information about the vtkusers mailing list