VTK  9.6.1
vtkPointLocator.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2// SPDX-License-Identifier: BSD-3-Clause
40
41#ifndef vtkPointLocator_h
42#define vtkPointLocator_h
43
44#include "vtkCommonDataModelModule.h" // For export macro
46
47#include <algorithm> // for std::min/std::max
48
49VTK_ABI_NAMESPACE_BEGIN
50class vtkCellArray;
51class vtkIdList;
52class vtkNeighborPoints;
53class vtkPoints;
54
55class VTKCOMMONDATAMODEL_EXPORT vtkPointLocator : public vtkIncrementalPointLocator
56{
57public:
63
65
69 void PrintSelf(ostream& os, vtkIndent indent) override;
71
73
76 vtkSetVector3Macro(Divisions, int);
77 vtkGetVectorMacro(Divisions, int, 3);
79
81
84 vtkSetClampMacro(NumberOfPointsPerBucket, int, 1, VTK_INT_MAX);
85 vtkGetMacro(NumberOfPointsPerBucket, int);
87
88 // Reuse any superclass signatures that we don't override.
90
97 vtkIdType FindClosestPoint(const double x[3]) override;
98
100
107 vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double& dist2) override;
109 double radius, const double x[3], double inputDataLength, double& dist2);
111
118 int InitPointInsertion(vtkPoints* newPts, const double bounds[6]) override;
119
126 int InitPointInsertion(vtkPoints* newPts, const double bounds[6], vtkIdType estNumPts) override;
127
137 void InsertPoint(vtkIdType ptId, const double x[3]) override;
138
149 vtkIdType InsertNextPoint(const double x[3]) override;
150
152
160 vtkIdType IsInsertedPoint(double x, double y, double z) override
161 {
162 double xyz[3];
163 xyz[0] = x;
164 xyz[1] = y;
165 xyz[2] = z;
166 return this->IsInsertedPoint(xyz);
167 }
168 vtkIdType IsInsertedPoint(const double x[3]) override;
170
180 int InsertUniquePoint(const double x[3], vtkIdType& ptId) override;
181
191 vtkIdType FindClosestInsertedPoint(const double x[3]) override;
192
201 void FindClosestNPoints(int N, const double x[3], vtkIdList* result) override;
202
204
211 virtual void FindDistributedPoints(int N, const double x[3], vtkIdList* result, int M);
212 virtual void FindDistributedPoints(int N, double x, double y, double z, vtkIdList* result, int M);
214
221 void FindPointsWithinRadius(double R, const double x[3], vtkIdList* result) override;
222
229 virtual vtkIdList* GetPointsInBucket(const double x[3], int ijk[3]);
230
232
235 vtkGetObjectMacro(Points, vtkPoints);
237
239
243 void Initialize() override;
244 void FreeSearchStructure() override;
245 void BuildLocator() override;
246 void ForceBuildLocator() override;
247 void GenerateRepresentation(int level, vtkPolyData* pd) override;
249
250protected:
253
254 void BuildLocatorInternal() override;
255
256 // place points in appropriate buckets
258 vtkNeighborPoints* buckets, const int ijk[3], const int ndivs[3], int level);
260 vtkNeighborPoints* buckets, const double x[3], const int ijk[3], double dist, int level);
261 void GetOverlappingBuckets(vtkNeighborPoints* buckets, const double x[3], double dist,
262 int prevMinLevel[3], int prevMaxLevel[3]);
263 void GenerateFace(int face, int i, int j, int k, vtkPoints* pts, vtkCellArray* polys);
264 double Distance2ToBucket(const double x[3], const int nei[3]);
265 double Distance2ToBounds(const double x[3], const double bounds[6]);
266
267 vtkPoints* Points; // Used for merging points
268 int Divisions[3]; // Number of sub-divisions in x-y-z directions
269 int NumberOfPointsPerBucket; // Used with previous boolean to control subdivide
270 vtkIdList** HashTable; // lists of point ids in buckets
271 double H[3]; // width of each bucket in x-y-z directions
272
276
277 // These are inlined methods and data members for performance reasons
278 double HX, HY, HZ;
279 double FX, FY, FZ, BX, BY, BZ;
281
282 void GetBucketIndices(const double* x, int ijk[3]) const
283 {
284 // Compute point index. Make sure it lies within range of locator.
285 vtkIdType tmp0 = static_cast<vtkIdType>(((x[0] - this->BX) * this->FX));
286 vtkIdType tmp1 = static_cast<vtkIdType>(((x[1] - this->BY) * this->FY));
287 vtkIdType tmp2 = static_cast<vtkIdType>(((x[2] - this->BZ) * this->FZ));
288
289 ijk[0] = std::min(std::max<vtkIdType>(tmp0, 0), this->XD - 1);
290 ijk[1] = std::min(std::max<vtkIdType>(tmp1, 0), this->YD - 1);
291 ijk[2] = std::min(std::max<vtkIdType>(tmp2, 0), this->ZD - 1);
292 }
293
294 vtkIdType GetBucketIndex(const double* x) const
295 {
296 int ijk[3];
297 this->GetBucketIndices(x, ijk);
298 return ijk[0] + ijk[1] * this->XD + ijk[2] * this->SliceSize;
299 }
300
302
303private:
304 vtkPointLocator(const vtkPointLocator&) = delete;
305 void operator=(const vtkPointLocator&) = delete;
306};
307
308VTK_ABI_NAMESPACE_END
309#endif
virtual vtkIdType FindClosestPoint(const double x[3])=0
Given a position x, return the id of the point closest to it.
object to represent cell connectivity
list of point or cell ids
Definition vtkIdList.h:24
virtual vtkIdType IsInsertedPoint(double x, double y, double z)=0
Determine whether or not a given point has been inserted.
a simple class to control print indentation
Definition vtkIndent.h:29
void InsertPoint(vtkIdType ptId, const double x[3]) override
Incrementally insert a point into search structure with a particular index value.
int InitPointInsertion(vtkPoints *newPts, const double bounds[6]) override
Initialize the point insertion process.
vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double &dist2) override
Given a position x and a radius r, return the id of the point closest to the point in that radius.
vtkIdType IsInsertedPoint(double x, double y, double z) override
Determine whether point given by x[3] has been inserted into points list.
void BuildLocator() override
See vtkLocator interface documentation.
void FindClosestNPoints(int N, const double x[3], vtkIdList *result) override
Find the closest N points to a position.
virtual void FindDistributedPoints(int N, double x, double y, double z, vtkIdList *result, int M)
Find the closest points to a position such that each octant of space around the position contains at ...
virtual vtkIdList * GetPointsInBucket(const double x[3], int ijk[3])
Given a position x, return the list of points in the bucket that contains the point.
static vtkPointLocator * New()
Construct with automatic computation of divisions, averaging 25 points per bucket.
void GetBucketIndices(const double *x, int ijk[3]) const
void GetBucketNeighbors(vtkNeighborPoints *buckets, const int ijk[3], const int ndivs[3], int level)
virtual void FindDistributedPoints(int N, const double x[3], vtkIdList *result, int M)
Find the closest points to a position such that each octant of space around the position contains at ...
void FreeSearchStructure() override
See vtkLocator interface documentation.
vtkIdList ** HashTable
void BuildLocatorInternal() override
This function is not pure virtual to maintain backwards compatibility.
void ForceBuildLocator() override
See vtkLocator interface documentation.
void Initialize() override
See vtkLocator interface documentation.
vtkIdType FindClosestPoint(const double x[3]) override
Given a position x, return the id of the point closest to it.
double Distance2ToBucket(const double x[3], const int nei[3])
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods for type management and printing.
virtual vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double inputDataLength, double &dist2)
Given a position x and a radius r, return the id of the point closest to the point in that radius.
void ComputePerformanceFactors()
vtkIdType IsInsertedPoint(const double x[3]) override
Determine whether point given by x[3] has been inserted into points list.
~vtkPointLocator() override
void GenerateRepresentation(int level, vtkPolyData *pd) override
See vtkLocator interface documentation.
void GenerateFace(int face, int i, int j, int k, vtkPoints *pts, vtkCellArray *polys)
vtkIdType InsertionPointId
void GetOverlappingBuckets(vtkNeighborPoints *buckets, const double x[3], double dist, int prevMinLevel[3], int prevMaxLevel[3])
void GetOverlappingBuckets(vtkNeighborPoints *buckets, const double x[3], const int ijk[3], double dist, int level)
vtkIdType GetBucketIndex(const double *x) const
vtkIdType InsertNextPoint(const double x[3]) override
Incrementally insert a point into search structure.
int InsertUniquePoint(const double x[3], vtkIdType &ptId) override
Determine whether point given by x[3] has been inserted into points list.
void FindPointsWithinRadius(double R, const double x[3], vtkIdList *result) override
Find all points within a specified radius R of position x.
double Distance2ToBounds(const double x[3], const double bounds[6])
int InitPointInsertion(vtkPoints *newPts, const double bounds[6], vtkIdType estNumPts) override
Initialize the point insertion process.
vtkIdType FindClosestInsertedPoint(const double x[3]) override
Given a position x, return the id of the point closest to it.
represent and manipulate 3D points
Definition vtkPoints.h:30
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition vtkPolyData.h:72
int vtkIdType
Definition vtkType.h:368
#define VTK_INT_MAX
Definition vtkType.h:197