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
49
50class vtkNeighborCells;
51
52class VTKCOMMONDATAMODEL_EXPORT vtkCellLocator : public vtkAbstractCellLocator
53{
54public:
56 void PrintSelf(ostream& os, vtkIndent indent) VTK_OVERRIDE;
57
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
175protected:
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
223private:
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.
virtual vtkIdList * GetCells(int bucket)
Get the cells in a particular bucket.
void FreeSearchStructure() override
Satisfy vtkLocator abstract interface.
static vtkCellLocator * New()
Construct with automatic computation of divisions, averaging 25 cells per bucket.
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.
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.
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