00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00044 #ifndef __vtkCellLocator_h
00045 #define __vtkCellLocator_h
00046
00047 #include "vtkLocator.h"
00048
00049 class vtkCellArray;
00050 class vtkGenericCell;
00051 class vtkIdList;
00052 class vtkNeighborCells;
00053 class vtkPoints;
00054
00055 class VTK_FILTERING_EXPORT vtkCellLocator : public vtkLocator
00056 {
00057 public:
00058 vtkTypeRevisionMacro(vtkCellLocator,vtkLocator);
00059 void PrintSelf(ostream& os, vtkIndent indent);
00060
00063 static vtkCellLocator *New();
00064
00066
00067 vtkSetClampMacro(NumberOfCellsPerBucket,int,1,VTK_LARGE_INTEGER);
00068 vtkGetMacro(NumberOfCellsPerBucket,int);
00070
00072
00077 vtkSetMacro(CacheCellBounds,int);
00078 vtkGetMacro(CacheCellBounds,int);
00079 vtkBooleanMacro(CacheCellBounds,int);
00081
00083
00085 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00086 float& t, float x[3], float pcoords[3],
00087 int &subId);
00089
00091
00093 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00094 float& t, float x[3], float pcoords[3],
00095 int &subId, vtkIdType &cellId);
00097
00099
00102 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00103 float& t, float x[3], float pcoords[3],
00104 int &subId, vtkIdType &cellId,
00105 vtkGenericCell *cell);
00107
00109
00112 void FindClosestPoint(float x[3], float closestPoint[3], vtkIdType &cellId,
00113 int &subId, float& dist2);
00115
00117
00126 void FindClosestPoint(float x[3], float closestPoint[3],
00127 vtkGenericCell *cell, vtkIdType &cellId, int &subId,
00128 float& dist2);
00130
00132
00138 int FindClosestPointWithinRadius(float x[3], float radius,
00139 float closestPoint[3], vtkIdType &cellId,
00140 int &subId, float& dist2);
00142
00144
00157 int FindClosestPointWithinRadius(float x[3], float radius,
00158 float closestPoint[3],
00159 vtkGenericCell *cell, vtkIdType &cellId,
00160 int &subId, float& dist2);
00162
00164
00179 int FindClosestPointWithinRadius(float x[3], float radius,
00180 float closestPoint[3],
00181 vtkGenericCell *cell, vtkIdType &cellId,
00182 int &subId, float& dist2, int &inside);
00184
00186 virtual vtkIdList *GetCells(int bucket);
00187
00190 virtual int GetNumberOfBuckets(void);
00191
00193
00194 void FreeSearchStructure();
00195 void BuildLocator();
00196 void GenerateRepresentation(int level, vtkPolyData *pd);
00198
00199 protected:
00200 vtkCellLocator();
00201 ~vtkCellLocator();
00202
00203 void GetBucketNeighbors(int ijk[3], int ndivs, int level);
00204 void GetOverlappingBuckets(float x[3], int ijk[3], float dist,
00205 int prevMinLevel[3], int prevMaxLevel[3]);
00206
00207 void ClearCellHasBeenVisited();
00208 void ClearCellHasBeenVisited(int id);
00209
00210 float Distance2ToBucket(float x[3], int nei[3]);
00211 float Distance2ToBounds(float x[3], float bounds[6]);
00212
00213 int NumberOfCellsPerBucket;
00214 int NumberOfOctants;
00215 float Bounds[6];
00216 int NumberOfParents;
00217 float H[3];
00218 int NumberOfDivisions;
00219 vtkIdList **Tree;
00220
00221 void MarkParents(void*, int, int, int, int, int);
00222 void GetChildren(int idx, int level, int children[8]);
00223 int GenerateIndex(int offset, int numDivs, int i, int j, int k,
00224 vtkIdType &idx);
00225 void GenerateFace(int face, int numDivs, int i, int j, int k,
00226 vtkPoints *pts, vtkCellArray *polys);
00227
00228 vtkNeighborCells *Buckets;
00229 unsigned char *CellHasBeenVisited;
00230 unsigned char QueryNumber;
00231 int CacheCellBounds;
00232
00233 float (*CellBounds)[6];
00234
00235 private:
00236 vtkCellLocator(const vtkCellLocator&);
00237 void operator=(const vtkCellLocator&);
00238 };
00239
00240 #endif
00241
00242