00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00057 #ifndef __vtkCellLocator_h
00058 #define __vtkCellLocator_h
00059
00060 #include "vtkLocator.h"
00061
00062 class vtkCellArray;
00063 class vtkGenericCell;
00064 class vtkIdList;
00065 class vtkNeighborCells;
00066 class vtkPoints;
00067
00068 class VTK_FILTERING_EXPORT vtkCellLocator : public vtkLocator
00069 {
00070 public:
00071 vtkTypeRevisionMacro(vtkCellLocator,vtkLocator);
00072 void PrintSelf(ostream& os, vtkIndent indent);
00073
00076 static vtkCellLocator *New();
00077
00079
00080 vtkSetClampMacro(NumberOfCellsPerBucket,int,1,VTK_LARGE_INTEGER);
00081 vtkGetMacro(NumberOfCellsPerBucket,int);
00083
00085
00090 vtkSetMacro(CacheCellBounds,int);
00091 vtkGetMacro(CacheCellBounds,int);
00092 vtkBooleanMacro(CacheCellBounds,int);
00094
00096
00098 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00099 float& t, float x[3], float pcoords[3],
00100 int &subId);
00102
00104
00106 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00107 float& t, float x[3], float pcoords[3],
00108 int &subId, vtkIdType &cellId);
00110
00112
00115 virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00116 float& t, float x[3], float pcoords[3],
00117 int &subId, vtkIdType &cellId,
00118 vtkGenericCell *cell);
00120
00122
00125 void FindClosestPoint(float x[3], float closestPoint[3], vtkIdType &cellId,
00126 int &subId, float& dist2);
00128
00130
00139 void FindClosestPoint(float x[3], float closestPoint[3],
00140 vtkGenericCell *cell, vtkIdType &cellId, int &subId,
00141 float& dist2);
00143
00145
00151 int FindClosestPointWithinRadius(float x[3], float radius,
00152 float closestPoint[3], vtkIdType &cellId,
00153 int &subId, float& dist2);
00155
00157
00170 int FindClosestPointWithinRadius(float x[3], float radius,
00171 float closestPoint[3],
00172 vtkGenericCell *cell, vtkIdType &cellId,
00173 int &subId, float& dist2);
00175
00177
00192 int FindClosestPointWithinRadius(float x[3], float radius,
00193 float closestPoint[3],
00194 vtkGenericCell *cell, vtkIdType &cellId,
00195 int &subId, float& dist2, int &inside);
00197
00199 virtual vtkIdList *GetCells(int bucket);
00200
00203 virtual int GetNumberOfBuckets(void);
00204
00206
00207 void FreeSearchStructure();
00208 void BuildLocator();
00209 void GenerateRepresentation(int level, vtkPolyData *pd);
00211
00212 protected:
00213 vtkCellLocator();
00214 ~vtkCellLocator();
00215
00216 void GetBucketNeighbors(int ijk[3], int ndivs, int level);
00217 void GetOverlappingBuckets(float x[3], int ijk[3], float dist,
00218 int prevMinLevel[3], int prevMaxLevel[3]);
00219
00220 void ClearCellHasBeenVisited();
00221 void ClearCellHasBeenVisited(int id);
00222
00223 float Distance2ToBucket(float x[3], int nei[3]);
00224 float Distance2ToBounds(float x[3], float bounds[6]);
00225
00226 int NumberOfCellsPerBucket;
00227 int NumberOfOctants;
00228 float Bounds[6];
00229 int NumberOfParents;
00230 float H[3];
00231 int NumberOfDivisions;
00232 vtkIdList **Tree;
00233
00234 void MarkParents(void*, int, int, int, int, int);
00235 void GetChildren(int idx, int level, int children[8]);
00236 int GenerateIndex(int offset, int numDivs, int i, int j, int k,
00237 vtkIdType &idx);
00238 void GenerateFace(int face, int numDivs, int i, int j, int k,
00239 vtkPoints *pts, vtkCellArray *polys);
00240
00241 vtkNeighborCells *Buckets;
00242 unsigned char *CellHasBeenVisited;
00243 unsigned char QueryNumber;
00244 int CacheCellBounds;
00245
00246 float (*CellBounds)[6];
00247
00248 private:
00249 vtkCellLocator(const vtkCellLocator&);
00250 void operator=(const vtkCellLocator&);
00251 };
00252
00253 #endif
00254
00255