[vtkusers] Bug in vtkStripper on a very simple case ?
pof
jd379252 at gmail.com
Wed Dec 19 15:42:17 EST 2012
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/20121219/bf2b33af/attachment.htm>
More information about the vtkusers
mailing list