[vtkusers] Number of points in a KdTree?

David Doria daviddoria+vtk at gmail.com
Mon Nov 2 21:13:50 EST 2009


On Fri, Oct 30, 2009 at 12:26 PM, David Doria <daviddoria+vtk at gmail.com> wrote:
> On Mon, Oct 26, 2009 at 4:53 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>> The purpose of  BuildLocatorFromPoints is described in the header. I
>> suspect that if you use this method, you cannot get the information
>> that you want.
>>
>> //     For the purpose of removing duplicate points quickly from large
>> //     data sets, or for finding nearby points, we added another mode for
>> //     building the locator.  BuildLocatorFromPoints will build a k-d tree
>> //     from one or more vtkPoints objects.  This can be followed by
>> //     BuildMapForDuplicatePoints which returns a mapping from the original
>> //     ids to a subset of the ids that is unique within a supplied
>> //     tolerance, or you can use FindPoint and FindClosestPoint to
>> //     locate points in the original set that the tree was built from.
>>
>> On Mon, Oct 26, 2009 at 4:40 PM, David Doria <daviddoria+vtk at gmail.com> wrote:
>>> On Mon, Oct 26, 2009 at 4:34 PM, Bill Lorensen <bill.lorensen at gmail.com> wrote:
>>>> I think the problem is that there is not a dataset associated with the
>>>> kdtree if you build it from points.
>>>>
>>>> If you build it from a dataset, there will probably be a dataset.
>>>>
>>>> Just a guess...
>
>
> Trying to build the tree from a dataset:
>
>        vtkSmartPointer<vtkPoints> Points = vtkSmartPointer<vtkPoints>::New();
>  Points->InsertNextPoint(0.0, 0.0, 0.0);
>  Points->InsertNextPoint(1.0, 0.0, 0.0);
>  Points->InsertNextPoint(0.0, 1.0, 0.0);
>
>        //get the number of points the file contains
>        vtkIdType NumPoints = Points->GetNumberOfPoints();
>  vtkstd::cout << "There are " << NumPoints << " points." << vtkstd::endl;
>
>  vtkSmartPointer<vtkPolyData> Polydata = vtkSmartPointer<vtkPolyData>::New();
>  Polydata->SetPoints(Points);
>
>        //Create the tree
>  vtkSmartPointer<vtkKdTree> KDTree = vtkSmartPointer<vtkKdTree>::New();
>  KDTree->AddDataSet(Polydata);
>        KDTree->BuildLocator();
>
>  vtkstd::cout << "Number of points in tree: " <<
> KDTree->GetDataSets()->GetNextDataSet()->GetNumberOfPoints() <<
> vtkstd::endl;
>
> I get an error "No cells to subdivide".  Does that mean I have to
> create vertices for my points before calling BuildLocator()?
>
> Thanks,
>
> David
>

Indeed vertices are required. An example of building a KDTree properly
and accessing its data is here:
http://www.vtk.org/Wiki/Create_a_KDTree

Thanks,

David



More information about the vtkusers mailing list