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 
52 class VTKCOMMONDATAMODEL_EXPORT vtkCellLocator : public vtkAbstractCellLocator
53 {
54 public:
56  void PrintSelf(ostream& os, vtkIndent indent) VTK_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) VTK_OVERRIDE;
87 
100  double x[3], double closestPoint[3],
101  vtkGenericCell *cell, vtkIdType &cellId,
102  int &subId, double& dist2) VTK_OVERRIDE;
103 
122  double x[3], double radius, double closestPoint[3],
123  vtkGenericCell *cell, vtkIdType &cellId,
124  int &subId, double& dist2, int &inside) VTK_OVERRIDE;
125 
129  virtual vtkIdList *GetCells(int bucket);
130 
135  virtual int GetNumberOfBuckets(void);
136 
143  double x[3], double tol2, vtkGenericCell *GenCell,
144  double pcoords[3], double *weights) VTK_OVERRIDE;
145 
151  void FindCellsWithinBounds(double *bbox, vtkIdList *cells) VTK_OVERRIDE;
152 
160  void FindCellsAlongLine(double p1[3], double p2[3],
161  double tolerance, vtkIdList *cells) VTK_OVERRIDE;
162 
164 
167  void FreeSearchStructure() VTK_OVERRIDE;
168  void BuildLocator() VTK_OVERRIDE;
169  virtual void BuildLocatorIfNeeded();
170  virtual void ForceBuildLocator();
171  virtual void BuildLocatorInternal();
172  void GenerateRepresentation(int level, vtkPolyData *pd) VTK_OVERRIDE;
174 
175 protected:
177  ~vtkCellLocator() VTK_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&) VTK_DELETE_FUNCTION;
225  void operator=(const vtkCellLocator&) VTK_DELETE_FUNCTION;
226 };
227 
228 #endif
229 
230 
an abstract base class for locators which find cells
virtual vtkIdType FindCell(double x[3])
Returns the Id of the cell containing the point, returns -1 if no cell found.
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 SetNumberOfCellsPerNode(int)
Specify the preferred/maximum number of cells in each node/bucket.
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.
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.
object to represent cell connectivity
Definition: vtkCellArray.h:51
octree-based spatial search object to quickly locate cells
void FindClosestPoint(double x[3], double closestPoint[3], vtkGenericCell *cell, vtkIdType &cellId, int &subId, double &dist2) override
Return the closest point and the cell which is closest to the point x.
void FreeSearchStructure() override
Satisfy vtkLocator abstract interface.
int GetNumberOfCellsPerBucket()
virtual int GetNumberOfBuckets(void)
Return number of buckets available.
void SetNumberOfCellsPerBucket(int N)
Specify the average number of cells in each octant.
void FindCellsWithinBounds(double *bbox, vtkIdList *cells) override
Return a list of unique cell ids inside of a given bounding box.
void FindCellsAlongLine(double p1[3], double p2[3], double tolerance, vtkIdList *cells) override
Given a finite line defined by the two points (p1,p2), return the list of unique cell ids in the buck...
vtkIdType FindCell(double x[3], double tol2, vtkGenericCell *GenCell, double pcoords[3], double *weights) override
Find the cell containing a given point.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
static vtkCellLocator * New()
Construct with automatic computation of divisions, averaging 25 cells per bucket.
int IntersectWithLine(double a0[3], double a1[3], double tol, double &t, double x[3], double pcoords[3], int &subId, vtkIdType &cellId, vtkGenericCell *cell) override
Return intersection point (if any) AND the cell which was intersected by the finite line.
virtual vtkIdList * GetCells(int bucket)
Get the cells in a particular bucket.
vtkIdType FindClosestPointWithinRadius(double x[3], double radius, double closestPoint[3], vtkGenericCell *cell, vtkIdType &cellId, int &subId, double &dist2, int &inside) override
Return the closest point within a specified radius and the cell which is closest to the point x.
provides thread-safe access to cells
list of point or cell ids
Definition: vtkIdList.h:37
a simple class to control print indentation
Definition: vtkIndent.h:40
represent and manipulate 3D points
Definition: vtkPoints.h:40
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:86
@ level
Definition: vtkX3D.h:395
@ radius
Definition: vtkX3D.h:252
@ offset
Definition: vtkX3D.h:438
int vtkIdType
Definition: vtkType.h:287