VTK  9.2.6
vtkIncrementalOctreePointLocator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkIncrementalOctreePointLocator.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 =========================================================================*/
70 #ifndef vtkIncrementalOctreePointLocator_h
71 #define vtkIncrementalOctreePointLocator_h
72 
73 #include "vtkCommonDataModelModule.h" // For export macro
75 
76 class vtkPoints;
77 class vtkIdList;
78 class vtkIntArray;
79 class vtkPolyData;
80 class vtkCellArray;
82 
83 class VTKCOMMONDATAMODEL_EXPORT vtkIncrementalOctreePointLocator : public vtkIncrementalPointLocator
84 {
85 public:
87  void PrintSelf(ostream& os, vtkIndent indent) override;
88 
90 
92 
102  vtkSetMacro(MaxPointsPerLeaf, int);
103  vtkGetMacro(MaxPointsPerLeaf, int);
105 
107 
110  vtkSetMacro(BuildCubicOctree, vtkTypeBool);
111  vtkGetMacro(BuildCubicOctree, vtkTypeBool);
112  vtkBooleanMacro(BuildCubicOctree, vtkTypeBool);
114 
116 
120  vtkGetObjectMacro(LocatorPoints, vtkPoints);
122 
126  void Initialize() override { this->FreeSearchStructure(); }
127 
131  void FreeSearchStructure() override;
132 
136  void GetBounds(double* bounds) override;
137 
141  double* GetBounds() override
142  {
143  this->GetBounds(this->Bounds);
144  return this->Bounds;
145  }
146 
154  vtkGetMacro(NumberOfNodes, int);
155 
163  vtkIdType FindClosestInsertedPoint(const double x[3]) override;
164 
166 
178  void GenerateRepresentation(int level, vtkPolyData* polysData) override;
180  bool (*UserGetBounds)(void* data, vtkIncrementalOctreeNode* node, double* bounds), void* data);
182 
183  // -------------------------------------------------------------------------
184  // ---------------------------- Point Location ----------------------------
185  // -------------------------------------------------------------------------
186 
192  void BuildLocator() override;
193 
197  void ForceBuildLocator() override;
198 
204  vtkIdType FindClosestPoint(const double x[3]) override;
205 
212  virtual vtkIdType FindClosestPoint(double x, double y, double z);
213 
220  virtual vtkIdType FindClosestPoint(const double x[3], double* miniDist2);
221 
228  virtual vtkIdType FindClosestPoint(double x, double y, double z, double* miniDist2);
229 
238  vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double& dist2) override;
239 
248  vtkIdType FindClosestPointWithinSquaredRadius(double radius2, const double x[3], double& dist2);
249 
256  void FindPointsWithinRadius(double R, const double x[3], vtkIdList* result) override;
257 
264  void FindPointsWithinSquaredRadius(double R2, const double x[3], vtkIdList* result);
265 
272  void FindClosestNPoints(int N, const double x[3], vtkIdList* result) override;
273 
274  // -------------------------------------------------------------------------
275  // ---------------------------- Point Insertion ----------------------------
276  // -------------------------------------------------------------------------
277 
287  int InitPointInsertion(vtkPoints* points, const double bounds[6]) override;
288 
299  int InitPointInsertion(vtkPoints* points, const double bounds[6], vtkIdType estSize) override;
300 
306  vtkIdType IsInsertedPoint(const double x[3]) override;
307 
313  vtkIdType IsInsertedPoint(double x, double y, double z) override;
314 
323  int InsertUniquePoint(const double point[3], vtkIdType& pntId) override;
324 
333  void InsertPoint(vtkIdType ptId, const double x[3]) override;
334 
343  vtkIdType InsertNextPoint(const double x[3]) override;
344 
354  void InsertPointWithoutChecking(const double point[3], vtkIdType& pntId, int insert);
355 
356  vtkIncrementalOctreeNode* GetRoot() const { return OctreeRootNode; }
357 
363 
364 protected:
367 
368 private:
369  vtkTypeBool BuildCubicOctree;
370  int MaxPointsPerLeaf;
371  double InsertTolerance2;
372  double OctreeMaxDimSize;
373  double FudgeFactor;
374  vtkPoints* LocatorPoints;
375  vtkIncrementalOctreeNode* OctreeRootNode;
376  int NumberOfNodes;
377 
378  void BuildLocatorInternal() override;
379 
383  static void DeleteAllDescendants(vtkIncrementalOctreeNode* node);
384 
389  static void AddPolys(vtkIncrementalOctreeNode* node, vtkPoints* points, vtkCellArray* polygs,
390  vtkIntArray* nodeIndexes, vtkIdType& cellIndex,
391  bool (*GetBounds)(void* data, vtkIncrementalOctreeNode* node, double* bounds), void* data);
392 
397  vtkIncrementalOctreeNode* GetLeafContainer(vtkIncrementalOctreeNode* node, const double pnt[3]);
398 
406  vtkIdType FindClosestPointInLeafNode(
407  vtkIncrementalOctreeNode* leafNode, const double point[3], double* dist2);
408 
421  vtkIdType FindClosestPointInSphere(const double point[3], double radius2,
422  vtkIncrementalOctreeNode* maskNode, double* minDist2, const double* refDist2);
423 
424  // -------------------------------------------------------------------------
425  // ---------------------------- Point Location ----------------------------
426  // -------------------------------------------------------------------------
427 
438  vtkIdType FindClosestPointInSphereWithoutTolerance(
439  const double point[3], double radius2, vtkIncrementalOctreeNode* maskNode, double* minDist2);
440 
446  void FindPointsWithinSquaredRadius(
447  vtkIncrementalOctreeNode* node, double radius2, const double point[3], vtkIdList* idList);
448 
449  // -------------------------------------------------------------------------
450  // ---------------------------- Point Insertion ----------------------------
451  // -------------------------------------------------------------------------
452 
464  vtkIdType FindClosestPointInSphereWithTolerance(
465  const double point[3], double radius2, vtkIncrementalOctreeNode* maskNode, double* minDist2);
466 
476  vtkIdType IsInsertedPoint(const double x[3], vtkIncrementalOctreeNode** leafContainer);
477 
486  vtkIdType IsInsertedPointForZeroTolerance(
487  const double x[3], vtkIncrementalOctreeNode** leafContainer);
488 
498  vtkIdType IsInsertedPointForNonZeroTolerance(
499  const double x[3], vtkIncrementalOctreeNode** leafContainer);
500 
508  vtkIdType FindDuplicatePointInLeafNode(vtkIncrementalOctreeNode* leafNode, const double point[3]);
509 
517  vtkIdType FindDuplicateFloatTypePointInVisitedLeafNode(
518  vtkIncrementalOctreeNode* leafNode, const double point[3]);
519 
527  vtkIdType FindDuplicateDoubleTypePointInVisitedLeafNode(
528  vtkIncrementalOctreeNode* leafNode, const double point[3]);
529 
531  void operator=(const vtkIncrementalOctreePointLocator&) = delete;
532 };
533 #endif
virtual double * GetBounds()
Provide an accessor to the bounds.
object to represent cell connectivity
Definition: vtkCellArray.h:296
list of point or cell ids
Definition: vtkIdList.h:143
Octree node constituting incremental octree (in support of both point location and point insertion)
Incremental octree in support of both point location and point insertion.
void GenerateRepresentation(int level, vtkPolyData *polysData, bool(*UserGetBounds)(void *data, vtkIncrementalOctreeNode *node, double *bounds), void *data)
vtkIdType IsInsertedPoint(const double x[3]) override
Determine whether or not a given point has been inserted into the octree.
vtkIdType FindClosestPointWithinRadius(double radius, const double x[3], double &dist2) override
Given a point x and a radius, return the id of the closest point within the radius and the associated...
virtual vtkIdType FindClosestPoint(const double x[3], double *miniDist2)
Given a point x, return the id of the closest point and the associated minimum squared distance (via ...
int InitPointInsertion(vtkPoints *points, const double bounds[6]) override
Initialize the point insertion process.
void InsertPoint(vtkIdType ptId, const double x[3]) override
Insert a given point into the octree with a specified point index ptId.
void FindClosestNPoints(int N, const double x[3], vtkIdList *result) override
Find the closest N points to a given point.
double * GetBounds() override
Get the spatial bounding box of the octree.
void FindPointsWithinSquaredRadius(double R2, const double x[3], vtkIdList *result)
Find all points within a squared radius R2 relative to a given point x.
int InsertUniquePoint(const double point[3], vtkIdType &pntId) override
Insert a point to the octree unless there has been a duplicate point.
void Initialize() override
Delete the octree search structure.
void GetBounds(double *bounds) override
Get the spatial bounding box of the octree.
void FindPointsWithinRadius(double R, const double x[3], vtkIdList *result) override
Find all points within a radius R relative to a given point x.
void InsertPointWithoutChecking(const double point[3], vtkIdType &pntId, int insert)
"Insert" a point to the octree without any checking.
vtkIncrementalOctreeNode * GetRoot() const
vtkIdType FindClosestPointWithinSquaredRadius(double radius2, const double x[3], double &dist2)
Given a point x and a squared radius radius2, return the id of the closest point within the radius an...
virtual vtkIdType FindClosestPoint(double x, double y, double z)
Given a point (x, y, z), return the id of the closest point.
static vtkIncrementalOctreePointLocator * New()
vtkIdType InsertNextPoint(const double x[3]) override
Insert a given point into the octree and return the point index.
void PrintSelf(ostream &os, vtkIndent indent) override
Standard type and print methods.
void ForceBuildLocator() override
Build the locator from the input dataset (even if UseExistingSearchStructure is on).
int GetNumberOfPoints()
Get the number of points maintained by the octree.
vtkIdType FindClosestPoint(const double x[3]) override
Given a point x, return the id of the closest point.
void GenerateRepresentation(int level, vtkPolyData *polysData) override
Create a polygonal representation of the octree 'level': for each node on the specified level we gene...
vtkIdType IsInsertedPoint(double x, double y, double z) override
Determine whether or not a given point has been inserted into the octree.
void FreeSearchStructure() override
Delete the octree search structure.
virtual vtkIdType FindClosestPoint(double x, double y, double z, double *miniDist2)
Given a point (x, y, z), return the id of the closest point and the associated minimum squared distan...
int GetNumberOfLevels()
Returns the maximum level of the tree.
vtkIdType FindClosestInsertedPoint(const double x[3]) override
Given a point x assumed to be covered by the octree, return the index of the closest in-octree point ...
int InitPointInsertion(vtkPoints *points, const double bounds[6], vtkIdType estSize) override
Initialize the point insertion process.
void BuildLocator() override
Load points from a dataset to construct an octree for point location.
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:119
dynamic, self-adjusting array of int
Definition: vtkIntArray.h:155
virtual void BuildLocatorInternal()
This function is not pure virtual to maintain backwards compatibility.
Definition: vtkLocator.h:222
virtual void FreeSearchStructure()=0
Free the memory required for the spatial data structure.
represent and manipulate 3D points
Definition: vtkPoints.h:149
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:200
void GetBounds(T a, double bds[6])
@ point
Definition: vtkX3D.h:242
@ points
Definition: vtkX3D.h:452
@ level
Definition: vtkX3D.h:401
@ radius
Definition: vtkX3D.h:258
@ data
Definition: vtkX3D.h:321
int vtkTypeBool
Definition: vtkABI.h:69
int vtkIdType
Definition: vtkType.h:332