[vtkusers] Bug in vtkStripper on a very simple case ?
pof
jd379252 at gmail.com
Fri Dec 21 12:56:08 EST 2012
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
> <mailto: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
>> <mailto: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 <mailto: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
>>> <mailto: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 <mailto: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 <mailto: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 <mailto: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 <http://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/407288d7/attachment.htm>
More information about the vtkusers
mailing list