VTK  9.2.6
vtkPointLocator.h
Go to the documentation of this file.
1/*=========================================================================
2
3 Program: Visualization Toolkit
4 Module: vtkPointLocator.h
5
6 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 All rights reserved.
8 See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9
10 This software is distributed WITHOUT ANY WARRANTY; without even
11 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12 PURPOSE. See the above copyright notice for more information.
13
14=========================================================================*/
58#ifndef vtkPointLocator_h
59#define vtkPointLocator_h
60
61#include "vtkCommonDataModelModule.h" // For export macro
63
64class vtkCellArray;
65class vtkIdList;
66class vtkNeighborPoints;
67class vtkPoints;
68
69class VTKCOMMONDATAMODEL_EXPORT vtkPointLocator : public vtkIncrementalPointLocator
70{
71public:
77
79
83 void PrintSelf(ostream& os, vtkIndent indent) override;
85
87
90 vtkSetVector3Macro(Divisions, int);
91 vtkGetVectorMacro(Divisions, int, 3);
93
95
98 vtkSetClampMacro(NumberOfPointsPerBucket, int, 1, VTK_INT_MAX);
99 vtkGetMacro(NumberOfPointsPerBucket, int);
101
102 // Re-use any superclass signatures that we don't override.
104
111 vtkIdType FindClosestPoint(const double x[3]) override;
112
114
121 vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double& dist2) override;
123 double radius, const double x[3], double inputDataLength, double& dist2);
125
132 int InitPointInsertion(vtkPoints* newPts, const double bounds[6]) override;
133
140 int InitPointInsertion(vtkPoints* newPts, const double bounds[6], vtkIdType estNumPts) override;
141
151 void InsertPoint(vtkIdType ptId, const double x[3]) override;
152
163 vtkIdType InsertNextPoint(const double x[3]) override;
164
166
171 vtkIdType IsInsertedPoint(double x, double y, double z) override
172 {
173 double xyz[3];
174 xyz[0] = x;
175 xyz[1] = y;
176 xyz[2] = z;
177 return this->IsInsertedPoint(xyz);
178 };
179 vtkIdType IsInsertedPoint(const double x[3]) override;
181
191 int InsertUniquePoint(const double x[3], vtkIdType& ptId) override;
192
200 vtkIdType FindClosestInsertedPoint(const double x[3]) override;
201
210 void FindClosestNPoints(int N, const double x[3], vtkIdList* result) override;
211
213
220 virtual void FindDistributedPoints(int N, const double x[3], vtkIdList* result, int M);
221 virtual void FindDistributedPoints(int N, double x, double y, double z, vtkIdList* result, int M);
223
230 void FindPointsWithinRadius(double R, const double x[3], vtkIdList* result) override;
231
238 virtual vtkIdList* GetPointsInBucket(const double x[3], int ijk[3]);
239
241
244 vtkGetObjectMacro(Points, vtkPoints);
246
248
252 void Initialize() override;
253 void FreeSearchStructure() override;
254 void BuildLocator() override;
255 void ForceBuildLocator() override;
256 void GenerateRepresentation(int level, vtkPolyData* pd) override;
258
259protected:
262
263 void BuildLocatorInternal() override;
264
265 // place points in appropriate buckets
267 vtkNeighborPoints* buckets, const int ijk[3], const int ndivs[3], int level);
269 vtkNeighborPoints* buckets, const double x[3], const int ijk[3], double dist, int level);
270 void GetOverlappingBuckets(vtkNeighborPoints* buckets, const double x[3], double dist,
271 int prevMinLevel[3], int prevMaxLevel[3]);
272 void GenerateFace(int face, int i, int j, int k, vtkPoints* pts, vtkCellArray* polys);
273 double Distance2ToBucket(const double x[3], const int nei[3]);
274 double Distance2ToBounds(const double x[3], const double bounds[6]);
275
276 vtkPoints* Points; // Used for merging points
277 int Divisions[3]; // Number of sub-divisions in x-y-z directions
278 int NumberOfPointsPerBucket; // Used with previous boolean to control subdivide
279 vtkIdList** HashTable; // lists of point ids in buckets
280 double H[3]; // width of each bucket in x-y-z directions
281
285
286 // These are inlined methods and data members for performance reasons
287 double HX, HY, HZ;
288 double FX, FY, FZ, BX, BY, BZ;
289 vtkIdType XD, YD, ZD, SliceSize;
290
291 void GetBucketIndices(const double* x, int ijk[3]) const
292 {
293 // Compute point index. Make sure it lies within range of locator.
294 vtkIdType tmp0 = static_cast<vtkIdType>(((x[0] - this->BX) * this->FX));
295 vtkIdType tmp1 = static_cast<vtkIdType>(((x[1] - this->BY) * this->FY));
296 vtkIdType tmp2 = static_cast<vtkIdType>(((x[2] - this->BZ) * this->FZ));
297
298 ijk[0] = tmp0 < 0 ? 0 : (tmp0 >= this->XD ? this->XD - 1 : tmp0);
299 ijk[1] = tmp1 < 0 ? 0 : (tmp1 >= this->YD ? this->YD - 1 : tmp1);
300 ijk[2] = tmp2 < 0 ? 0 : (tmp2 >= this->ZD ? this->ZD - 1 : tmp2);
301 }
302
303 vtkIdType GetBucketIndex(const double* x) const
304 {
305 int ijk[3];
306 this->GetBucketIndices(x, ijk);
307 return ijk[0] + ijk[1] * this->XD + ijk[2] * this->SliceSize;
308 }
309
311
312private:
313 vtkPointLocator(const vtkPointLocator&) = delete;
314 void operator=(const vtkPointLocator&) = delete;
315};
316
317#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:43
Abstract class in support of both point location and point insertion.
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:49
quickly locate points in 3-space
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:49
concrete dataset represents vertices, lines, polygons, and triangle strips
int vtkIdType
Definition vtkType.h:332
#define VTK_INT_MAX
Definition vtkType.h:155