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 =========================================================================*/
44 #ifndef vtkCellLocator_h
45 #define vtkCellLocator_h
46 
47 #include "vtkCommonDataModelModule.h" // For export macro
48 #include "vtkAbstractCellLocator.h"
49 
50 class vtkNeighborCells;
51 
53 {
54 public:
56  void PrintSelf(ostream& os, vtkIndent indent) override;
57 
62  static vtkCellLocator *New();
63 
68  { this->SetNumberOfCellsPerNode(N); }
70  { return this->NumberOfCellsPerNode; }
71 
72  // Re-use any superclass signatures that we don't override.
77 
83  int IntersectWithLine(double a0[3], double a1[3], double tol,
84  double& t, double x[3], double pcoords[3],
85  int &subId, vtkIdType &cellId,
86  vtkGenericCell *cell) override;
87 
99  void FindClosestPoint(
100  double x[3], double closestPoint[3],
101  vtkGenericCell *cell, vtkIdType &cellId,
102  int &subId, double& dist2) override;
103 
122  double x[3], double radius, double closestPoint[3],
123  vtkGenericCell *cell, vtkIdType &cellId,
124  int &subId, double& dist2, int &inside) override;
125 
129  virtual vtkIdList *GetCells(int bucket);
130 
135  virtual int GetNumberOfBuckets(void);
136 
142  vtkIdType FindCell(
143  double x[3], double tol2, vtkGenericCell *GenCell,
144  double pcoords[3], double *weights) override;
145 
151  void FindCellsWithinBounds(double *bbox, vtkIdList *cells) override;
152 
160  void FindCellsAlongLine(double p1[3], double p2[3],
161  double tolerance, vtkIdList *cells) override;
162 
164 
167  void FreeSearchStructure() override;
168  void BuildLocator() override;
169  virtual void BuildLocatorIfNeeded();
170  virtual void ForceBuildLocator();
171  virtual void BuildLocatorInternal();
172  void GenerateRepresentation(int level, vtkPolyData *pd) override;
174 
175 protected:
176  vtkCellLocator();
177  ~vtkCellLocator() override;
178 
179  void GetBucketNeighbors(int ijk[3], int ndivs, int level);
180  void GetOverlappingBuckets(double x[3], int ijk[3], double dist,
181  int prevMinLevel[3], int prevMaxLevel[3]);
182 
183  void ClearCellHasBeenVisited();
184  void ClearCellHasBeenVisited(int id);
185 
186  double Distance2ToBucket(double x[3], int nei[3]);
187  double Distance2ToBounds(double x[3], double bounds[6]);
188 
189  int NumberOfOctants; // number of octants in tree
190  double Bounds[6]; // bounding box root octant
191  int NumberOfParents; // number of parent octants
192  double H[3]; // width of leaf octant in x-y-z directions
193  int NumberOfDivisions; // number of "leaf" octant sub-divisions
194  vtkIdList **Tree; // octree
195 
196  void MarkParents(void*, int, int, int, int, int);
197  void GetChildren(int idx, int level, int children[8]);
198  int GenerateIndex(int offset, int numDivs, int i, int j, int k,
199  vtkIdType &idx);
200  void GenerateFace(int face, int numDivs, int i, int j, int k,
201  vtkPoints *pts, vtkCellArray *polys);
202 
203  vtkNeighborCells *Buckets;
204  unsigned char *CellHasBeenVisited;
205  unsigned char QueryNumber;
206 
207  void ComputeOctantBounds(int i, int j, int k);
208  double OctantBounds[6]; //the bounds of the current octant
209  int IsInOctantBounds(double x[3], double tol = 0.0)
210  {
211  if ( this->OctantBounds[0]-tol <= x[0] && x[0] <= this->OctantBounds[1]+tol &&
212  this->OctantBounds[2]-tol <= x[1] && x[1] <= this->OctantBounds[3]+tol &&
213  this->OctantBounds[4]-tol <= x[2] && x[2] <= this->OctantBounds[5]+tol )
214  {
215  return 1;
216  }
217  else
218  {
219  return 0;
220  }
221  }
222 
223 private:
224  vtkCellLocator(const vtkCellLocator&) = delete;
225  void operator=(const vtkCellLocator&) = delete;
226 };
227 
228 #endif
229 
230 
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.
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:85
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:39
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:36
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:50
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.
#define VTKCOMMONDATAMODEL_EXPORT
represent and manipulate 3D points
Definition: vtkPoints.h:39