00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00043 #ifndef __vtkCellLocator_h
00044 #define __vtkCellLocator_h
00045
00046 #include "vtkAbstractCellLocator.h"
00047
00048 class vtkNeighborCells;
00049
00050 class VTK_FILTERING_EXPORT vtkCellLocator : public vtkAbstractCellLocator
00051 {
00052 public:
00053 vtkTypeMacro(vtkCellLocator,vtkAbstractCellLocator);
00054 void PrintSelf(ostream& os, vtkIndent indent);
00055
00058 static vtkCellLocator *New();
00059
00061
00062 void SetNumberOfCellsPerBucket(int N)
00063 { this->SetNumberOfCellsPerNode(N); }
00064 int GetNumberOfCellsPerBucket()
00065 { return this->NumberOfCellsPerNode; }
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00079
00080 virtual int IntersectWithLine(
00081 double a0[3], double a1[3], double tol,
00082 double& t, double x[3], double pcoords[3],
00083 int &subId)
00084 {
00085 return Superclass::
00086 IntersectWithLine(a0, a1, tol,t, x, pcoords, subId);
00087 }
00089
00091
00092 virtual int IntersectWithLine(
00093 double a0[3], double a1[3], double tol,
00094 double& t, double x[3], double pcoords[3],
00095 int &subId, vtkIdType &cellId)
00096 {
00097 return Superclass::
00098 IntersectWithLine(a0, a1, tol,t, x, pcoords, subId, cellId);
00099 }
00101
00103
00104 virtual int IntersectWithLine(
00105 const double a0[3], const double a1[3],
00106 vtkPoints *points, vtkIdList *cellIds)
00107 {
00108 return Superclass::
00109 IntersectWithLine(a0, a1, points, cellIds);
00110 }
00112
00114
00118 virtual int IntersectWithLine(double a0[3], double a1[3], double tol,
00119 double& t, double x[3], double pcoords[3],
00120 int &subId, vtkIdType &cellId,
00121 vtkGenericCell *cell);
00123
00125
00126 virtual void FindClosestPoint(
00127 double x[3], double closestPoint[3],
00128 vtkIdType &cellId, int &subId, double& dist2)
00129 {
00130 Superclass::
00131 FindClosestPoint(x, closestPoint, cellId, subId, dist2);
00132 }
00134
00136
00145 virtual void FindClosestPoint(
00146 double x[3], double closestPoint[3],
00147 vtkGenericCell *cell, vtkIdType &cellId,
00148 int &subId, double& dist2);
00150
00152
00153 virtual vtkIdType FindClosestPointWithinRadius(
00154 double x[3], double radius,
00155 double closestPoint[3], vtkIdType &cellId,
00156 int &subId, double& dist2)
00157 {
00158 return Superclass::FindClosestPointWithinRadius
00159 (x, radius, closestPoint, cellId, subId, dist2);
00160 }
00162
00164
00165 virtual vtkIdType FindClosestPointWithinRadius(
00166 double x[3], double radius,
00167 double closestPoint[3],
00168 vtkGenericCell *cell, vtkIdType &cellId,
00169 int &subId, double& dist2)
00170 {
00171 return Superclass::FindClosestPointWithinRadius
00172 (x, radius, closestPoint, cell, cellId, subId, dist2);
00173 }
00175
00177
00193 virtual vtkIdType FindClosestPointWithinRadius(
00194 double x[3], double radius, double closestPoint[3],
00195 vtkGenericCell *cell, vtkIdType &cellId,
00196 int &subId, double& dist2, int &inside);
00198
00200 virtual vtkIdList *GetCells(int bucket);
00201
00204 virtual int GetNumberOfBuckets(void);
00205
00207
00209 virtual vtkIdType FindCell(double x[3])
00210 { return this->Superclass::FindCell(x); }
00212
00214
00217 virtual vtkIdType FindCell(
00218 double x[3], double tol2, vtkGenericCell *GenCell,
00219 double pcoords[3], double *weights);
00221
00225 virtual void FindCellsWithinBounds(double *bbox, vtkIdList *cells);
00226
00228
00233 virtual void FindCellsAlongLine(
00234 double p1[3], double p2[3], double tolerance, vtkIdList *cells);
00236
00238
00239 virtual void FreeSearchStructure();
00240 virtual void BuildLocator();
00241 virtual void BuildLocatorIfNeeded();
00242 virtual void ForceBuildLocator();
00243 virtual void BuildLocatorInternal();
00244 virtual void GenerateRepresentation(int level, vtkPolyData *pd);
00246
00247 protected:
00248 vtkCellLocator();
00249 ~vtkCellLocator();
00250
00251 void GetBucketNeighbors(int ijk[3], int ndivs, int level);
00252 void GetOverlappingBuckets(double x[3], int ijk[3], double dist,
00253 int prevMinLevel[3], int prevMaxLevel[3]);
00254
00255 void ClearCellHasBeenVisited();
00256 void ClearCellHasBeenVisited(int id);
00257
00258 double Distance2ToBucket(double x[3], int nei[3]);
00259 double Distance2ToBounds(double x[3], double bounds[6]);
00260
00261 int NumberOfOctants;
00262 double Bounds[6];
00263 int NumberOfParents;
00264 double H[3];
00265 int NumberOfDivisions;
00266 vtkIdList **Tree;
00267
00268 void MarkParents(void*, int, int, int, int, int);
00269 void GetChildren(int idx, int level, int children[8]);
00270 int GenerateIndex(int offset, int numDivs, int i, int j, int k,
00271 vtkIdType &idx);
00272 void GenerateFace(int face, int numDivs, int i, int j, int k,
00273 vtkPoints *pts, vtkCellArray *polys);
00274
00275 vtkNeighborCells *Buckets;
00276 unsigned char *CellHasBeenVisited;
00277 unsigned char QueryNumber;
00278
00279 void ComputeOctantBounds(int i, int j, int k);
00280 double OctantBounds[6];
00281 int IsInOctantBounds(double x[3])
00282 {
00283 if ( this->OctantBounds[0] <= x[0] && x[0] <= this->OctantBounds[1] &&
00284 this->OctantBounds[2] <= x[1] && x[1] <= this->OctantBounds[3] &&
00285 this->OctantBounds[4] <= x[2] && x[2] <= this->OctantBounds[5] )
00286 {
00287 return 1;
00288 }
00289 else
00290 {
00291 return 0;
00292 }
00293 }
00294
00295 private:
00296 vtkCellLocator(const vtkCellLocator&);
00297 void operator=(const vtkCellLocator&);
00298 };
00299
00300 #endif
00301
00302