VTK
vtkCellLocator.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkCellLocator.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 =========================================================================*/
38 #ifndef vtkCellLocator_h
39 #define vtkCellLocator_h
40 
41 #include "vtkCommonDataModelModule.h" // For export macro
42 #include "vtkAbstractCellLocator.h"
43 
44 class vtkNeighborCells;
45 
46 class VTKCOMMONDATAMODEL_EXPORT vtkCellLocator : public vtkAbstractCellLocator
47 {
48 public:
50  void PrintSelf(ostream& os, vtkIndent indent) override;
51 
56  static vtkCellLocator *New();
57 
62  { this->SetNumberOfCellsPerNode(N); }
64  { return this->NumberOfCellsPerNode; }
65 
66  // Re-use any superclass signatures that we don't override.
71 
78  int IntersectWithLine(double a0[3], double a1[3], double tol,
79  double& t, double x[3], double pcoords[3],
80  int &subId, vtkIdType &cellId,
81  vtkGenericCell *cell) override;
82 
94  void FindClosestPoint(
95  double x[3], double closestPoint[3],
96  vtkGenericCell *cell, vtkIdType &cellId,
97  int &subId, double& dist2) override;
98 
117  double x[3], double radius, double closestPoint[3],
118  vtkGenericCell *cell, vtkIdType &cellId,
119  int &subId, double& dist2, int &inside) override;
120 
124  virtual vtkIdList *GetCells(int bucket);
125 
130  virtual int GetNumberOfBuckets(void);
131 
138  double x[3], double tol2, vtkGenericCell *GenCell,
139  double pcoords[3], double *weights) override;
140 
146  void FindCellsWithinBounds(double *bbox, vtkIdList *cells) override;
147 
155  void FindCellsAlongLine(double p1[3], double p2[3],
156  double tolerance, vtkIdList *cells) override;
157 
159 
162  void FreeSearchStructure() override;
163  void BuildLocator() override;
164  virtual void BuildLocatorIfNeeded();
165  virtual void ForceBuildLocator();
166  virtual void BuildLocatorInternal();
167  void GenerateRepresentation(int level, vtkPolyData *pd) override;
169 
170 protected:
171  vtkCellLocator();
172  ~vtkCellLocator() override;
173 
174  void GetBucketNeighbors(int ijk[3], int ndivs, int level);
175  void GetOverlappingBuckets(double x[3], int ijk[3], double dist,
176  int prevMinLevel[3], int prevMaxLevel[3]);
177 
178  void ClearCellHasBeenVisited();
179  void ClearCellHasBeenVisited(int id);
180 
181  double Distance2ToBucket(double x[3], int nei[3]);
182  double Distance2ToBounds(double x[3], double bounds[6]);
183 
184  int NumberOfOctants; // number of octants in tree
185  double Bounds[6]; // bounding box root octant
186  int NumberOfParents; // number of parent octants
187  double H[3]; // width of leaf octant in x-y-z directions
188  int NumberOfDivisions; // number of "leaf" octant sub-divisions
189  vtkIdList **Tree; // octree
190 
191  void MarkParents(void*, int, int, int, int, int);
192  void GetChildren(int idx, int level, int children[8]);
193  int GenerateIndex(int offset, int numDivs, int i, int j, int k,
194  vtkIdType &idx);
195  void GenerateFace(int face, int numDivs, int i, int j, int k,
196  vtkPoints *pts, vtkCellArray *polys);
197 
198  vtkNeighborCells *Buckets;
199  unsigned char *CellHasBeenVisited;
200  unsigned char QueryNumber;
201 
202  void ComputeOctantBounds(int i, int j, int k);
203  double OctantBounds[6]; //the bounds of the current octant
204  int IsInOctantBounds(double x[3], double tol = 0.0)
205  {
206  if ( this->OctantBounds[0]-tol <= x[0] && x[0] <= this->OctantBounds[1]+tol &&
207  this->OctantBounds[2]-tol <= x[1] && x[1] <= this->OctantBounds[3]+tol &&
208  this->OctantBounds[4]-tol <= x[2] && x[2] <= this->OctantBounds[5]+tol )
209  {
210  return 1;
211  }
212  else
213  {
214  return 0;
215  }
216  }
217 
218 private:
219  vtkCellLocator(const vtkCellLocator&) = delete;
220  void operator=(const vtkCellLocator&) = delete;
221 };
222 
223 #endif
virtual void BuildLocator()=0
Build the locator from the input dataset.
virtual vtkIdType FindClosestPointWithinRadius(double x[3], double radius, double closestPoint[3], vtkIdType &cellId, int &subId, double &dist2)
Return the closest point within a specified radius and the cell which is closest to the point x...
virtual void FindClosestPoint(double x[3], double closestPoint[3], vtkIdType &cellId, int &subId, double &dist2)
Return the closest point and the cell which is closest to the point x.
virtual void FindCellsAlongLine(double p1[3], double p2[3], double tolerance, vtkIdList *cells)
Given a finite line defined by the two points (p1,p2), return the list of unique cell ids in the buck...
virtual void FindCellsWithinBounds(double *bbox, vtkIdList *cells)
Return a list of unique cell ids inside of a given bounding box.
vtkNeighborCells * Buckets
virtual void SetNumberOfCellsPerNode(int)
Specify the preferred/maximum number of cells in each node/bucket.
an abstract base class for locators which find cells
int GetNumberOfCellsPerBucket()
void SetNumberOfCellsPerBucket(int N)
Specify the average number of cells in each octant.
int vtkIdType
Definition: vtkType.h:345
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:79
virtual void FreeSearchStructure()=0
Free the memory required for the spatial data structure.
provides thread-safe access to cells
unsigned char * CellHasBeenVisited
octree-based spatial search object to quickly locate cells
int IsInOctantBounds(double x[3], double tol=0.0)
a simple class to control print indentation
Definition: vtkIndent.h:33
virtual vtkIdType FindCell(double x[3])
Returns the Id of the cell containing the point, returns -1 if no cell found.
list of point or cell ids
Definition: vtkIdList.h:30
unsigned char QueryNumber
virtual int IntersectWithLine(double p1[3], double p2[3], double tol, double &t, double x[3], double pcoords[3], int &subId)
Return intersection point (if any) of finite line with cells contained in cell locator.
object to represent cell connectivity
Definition: vtkCellArray.h:44
vtkIdList ** Tree
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
virtual void GenerateRepresentation(int level, vtkPolyData *pd)=0
Method to build a representation at a particular level.
represent and manipulate 3D points
Definition: vtkPoints.h:33