Hi,<br><br>I was trying to use vtkKdTreePointLocator to find closest points but from the results i obtain i&#39;m wondering wheather there is an issue with the method FindClosestPointWithinRadius, because sometimes it returns some points with a distance bigger than the radius.<br>
<br>This method calls vtkKdTree::FindClosestPointWithinRadius which calls vtkKdTree::FindClosestPointInSphere, but here the point returned can be out of the sphere.<br>I think there must be an additional test in one of these two methods to compare the distance and the given radius.<br>
<br>here is a program test, with a comparison with vtkPointLocator that works well.<br><br>PS: i also want to bring back this problem:<br><a href="http://old.nabble.com/vtkCellLocator-precision-issue-td27453637.html#a27453637">http://old.nabble.com/vtkCellLocator-precision-issue-td27453637.html#a27453637</a><br>
which can maybe solve this one<br><a href="http://old.nabble.com/vtkCell::IntersectWithLine-issues-td18225442.html#a18234362">http://old.nabble.com/vtkCell::IntersectWithLine-issues-td18225442.html#a18234362</a><br><br><br>
#include &lt;vtk/vtkActor.h&gt;<br>#include &lt;vtk/vtkCleanPolyData.h&gt;<br>#include &lt;vtk/vtkCubeSource.h&gt;<br>#include &lt;vtk/vtkPolyData.h&gt;<br>#include &lt;vtk/vtkPolyDataMapper.h&gt;<br>#include &lt;vtk/vtkProperty.h&gt;<br>
#include &lt;vtk/vtkRenderer.h&gt;<br>#include &lt;vtk/vtkRenderWindow.h&gt;<br>#include &lt;vtk/vtkRenderWindowInteractor.h&gt;<br>#include &lt;vtk/vtkSmartPointer.h&gt;<br><br>#define MY_SP(class, variable)\<br>   vtkSmartPointer&lt;class&gt; variable = vtkSmartPointer&lt;class&gt;::New();<br>
<br>const double cst_dRadius = 1.2;<br><br>#include &lt;vtk/vtkKdTreePointLocator.h&gt;<br>#include &lt;vtk/vtkPointLocator.h&gt;<br><br>bool ComputePointDistances(vtkKdTreePointLocator *locator, vtkPolyData *in)<br>{<br>
   int num = in-&gt;GetNumberOfPoints();<br>   cout &lt;&lt; &quot;number of input points : &quot; &lt;&lt; num &lt;&lt; endl;<br>   vtkPoints *pPoints = in-&gt;GetPoints();<br>   double pt[3];<br>   int cpt = 0;<br>   double dDist2 = 0;<br>
<br>   int bad = 0;<br>   int id = -1;<br>   for(int i=0; i&lt;num; ++i)<br>   {<br>      pPoints-&gt;GetPoint(i, pt);<br>      id = locator-&gt;FindClosestPointWithinRadius(cst_dRadius, pt, dDist2);<br>      if(-1 != id)<br>
      {<br>         if(sqrt(dDist2) &gt; cst_dRadius)<br>            ++bad;<br>         ++cpt;<br>      }<br>   }<br>   cout &lt;&lt; &quot;should not be tested : &quot; &lt;&lt; bad &lt;&lt; endl;<br>   cout &lt;&lt; &quot;number of distances computed : &quot; &lt;&lt; cpt &lt;&lt; endl;<br>
<br>   return true;<br>}<br>bool ComputePointDistances(vtkPointLocator *locator, vtkPolyData *in)<br>{<br>   int num = in-&gt;GetNumberOfPoints();<br>   cout &lt;&lt; &quot;number of input points : &quot; &lt;&lt; num &lt;&lt; endl;<br>
   vtkPoints *pPoints = in-&gt;GetPoints();<br>   double pt[3];<br>   int cpt = 0;<br>   double dDist2 = 0;<br><br>   int bad = 0;<br>   int id = -1;<br>   for(int i=0; i&lt;num; ++i)<br>   {<br>      pPoints-&gt;GetPoint(i, pt);<br>
      id = locator-&gt;FindClosestPointWithinRadius(cst_dRadius, pt, dDist2);<br>      if(-1 != id)<br>      {<br>         if(sqrt(dDist2) &gt; cst_dRadius)<br>            ++bad;<br>         ++cpt;<br>      }<br>   }<br>   cout &lt;&lt; &quot;should not be tested : &quot; &lt;&lt; bad &lt;&lt; endl;<br>
   cout &lt;&lt; &quot;number of distances computed : &quot; &lt;&lt; cpt &lt;&lt; endl;<br><br>   return true;<br>}<br><br>int main(int argc, char* argv[])<br>{<br>   /////////////////////////////////////////////////////////<br>
   MY_SP(vtkRenderer, ren1);<br>   ren1-&gt;SetBackground(0.2, 0.2, 0.2);<br>   MY_SP(vtkRenderWindow, renWin);<br>   renWin-&gt;SetSize( 512, 512 );<br>   renWin-&gt;AddRenderer(ren1);<br>   MY_SP(vtkRenderWindowInteractor, iren);<br>
   iren-&gt;SetRenderWindow(renWin);<br><br>   /////////////////////////////////////////////////////////<br>   MY_SP(vtkCubeSource, src);<br>   src-&gt;SetBounds(-1,1,-1,1,-1,1);<br>   src-&gt;Update();<br><br>   MY_SP(vtkCleanPolyData, clean);<br>
   clean-&gt;SetInputConnection(src-&gt;GetOutputPort());<br>   clean-&gt;Update();<br>   vtkPolyData *cube = clean-&gt;GetOutput();<br><br>   MY_SP(vtkPolyDataMapper, Map);<br>   Map-&gt;SetInput(cube);<br><br>   MY_SP(vtkActor, act);<br>
   act-&gt;SetMapper(Map);<br>   act-&gt;GetProperty()-&gt;SetInterpolationToFlat();<br>   act-&gt;GetProperty()-&gt;SetColor(1.0, 0.0, 0.0);<br><br>   ren1-&gt;AddActor(act);<br><br><br>   MY_SP(vtkCubeSource, src2);<br>
   src2-&gt;SetBounds(0,2,0,2,0,2);<br>   src2-&gt;Update();<br><br>   MY_SP(vtkCleanPolyData, clean2);<br>   clean2-&gt;SetInputConnection(src2-&gt;GetOutputPort());<br>   clean2-&gt;Update();<br>   vtkPolyData *cube2 = clean2-&gt;GetOutput();<br>
<br>   MY_SP(vtkPolyDataMapper, Map2);<br>   Map2-&gt;SetInput(cube2);<br><br>   MY_SP(vtkActor, act2);<br>   act2-&gt;SetMapper(Map2);<br>   act2-&gt;GetProperty()-&gt;SetInterpolationToFlat();<br>   act2-&gt;GetProperty()-&gt;SetColor(0.0, 1.0, 0.0);<br>
<br>   ren1-&gt;AddActor(act2);<br><br>   /////////////////////////////////////////////////////////<br>   MY_SP(vtkPointLocator, locator);<br>   locator-&gt;SetTolerance(0.0);<br>   locator-&gt;SetDataSet(cube2);<br>   locator-&gt;BuildLocator();<br>
<br>   ComputePointDistances(locator, cube);<br><br>   MY_SP(vtkKdTreePointLocator, locator2);<br>   locator2-&gt;SetTolerance(0.0);<br>   locator2-&gt;SetDataSet(cube2);<br>   locator2-&gt;BuildLocator();<br><br>   ComputePointDistances(locator2, cube);<br>
<br>   /////////////////////////////////////////////////////////<br>   ren1-&gt;ResetCamera();<br>   renWin-&gt;Render();<br>   iren-&gt;Start();<br><br>   /////////////////////////////////////////////////////////<br>   return 0;<br>
}<br><br>