[vtkusers] vtkOBBTree::IntersectWithLine (version which returns all cell ids) question/problem
Alex Malyushytskyy
alexmalvtk at gmail.com
Fri Aug 19 19:24:21 EDT 2011
As for me this is a bug.
There is no any reason to expect polydata be a connected region .
Functions is supposed to be able to return all the intersected cells
unless output is controlled by option set.
If it was designed for such behavior cause somebody needed it,
it seems logical to add a member variable which would allow either to
return all cells or just "entry and exit points".
Instead of maintaining subclass I would prefer to create a patch
if anybody could comment on this,
Regards,
Alex
On Wed, Aug 17, 2011 at 4:23 PM, Alex Malyushytskyy
<alexmalvtk at gmail.com> wrote:
> I need to get all cell ids in arbitraty poly data which are
> intersected by line segment.
>
> At the first glance example I found in VTK wiki which used
> int vtkOBBTree IntersectWithLine(const double a0[3], const double a1[3],
> vtkPoints *points, vtkIdList *cellIds);
> should solve the problem.
> Especially because of the comment "tkOBBTree returns ALL intersections
> with a line and the dataset".
>
> Unfortunately this function does not work for arbitrary data (at least
> in vtk 5.6.1 ).
>
> Example is polydata which consists of 2 disconnected triangles ( from
> debug output):
>
> Number of cells =2
> cellId =0
> pnt0 id = 0 x,y,z = { 18944,2166,340.981 }
> pnt1 id = 1 x,y,z = { 18985.1,2242,340.981 }
> pnt2 id = 2 x,y,z = { 18912.4,2188,340.981 }
> center x,y,z = { 18947.2,2198.67,340.981 }
> cellId =1
> pnt0 id = 3 x,y,z = { 18944,2166,330.981 }
> pnt1 id = 4 x,y,z = { 18985.1,2242,330.981 }
> pnt2 id = 5 x,y,z = { 18912.4,2188,330.981 }
> center x,y,z = { 18947.2,2198.67,330.981 }
>
> (line intersecting centers of triangles:)
>
> line begin x,y,z = { 18947.2,2198.67,329.981 }
> line end x,y,z = { 18947.2,2198.67,341.981 }
>
>
> vtkOBBTree IntersectWithLine wil return only single id:
>
> intersecting 1 cells.
> where cellIdList(0) cell_id = 1
>
> Second triangle will not pass "sense" check at line 840 vtkOBBTree:.
> // only use point if it moves us forward,
> // or it moves us backward by less than tol
> if (distance > lastDistance - ptol && sense != lastSense)
>
>
> I am not sure if it is a bug or comes from "closed surface" assumption,
> but I am sure this prevents me from getting intersections I need.
>
> As a quick fix I am thinking to subclass vtkOBBTree and create a
> function which will not be using such check,
> but I guess it would makes more sense either to add parameter to vtkOBBTree
> original function which would allow to skip such check , or add class
> member which will control such behavior.
>
> Anybody could comment on this?
>
> Regards,
> Alex
>
More information about the vtkusers
mailing list