00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 
00039 
00067 #ifndef __vtkCellLocator_h
00068 #define __vtkCellLocator_h
00069 
00070 #include "vtkLocator.h"
00071 
00072 class vtkNeighborCells;
00073 
00074 class VTK_EXPORT vtkCellLocator : public vtkLocator
00075 {
00076 public:
00077   vtkTypeMacro(vtkCellLocator,vtkLocator);
00078   void PrintSelf(ostream& os, vtkIndent indent);
00079 
00082   static vtkCellLocator *New();
00083 
00085   vtkSetClampMacro(NumberOfCellsPerBucket,int,1,VTK_LARGE_INTEGER);
00086   vtkGetMacro(NumberOfCellsPerBucket,int);
00087 
00093   vtkSetMacro(CacheCellBounds,int);
00094   vtkGetMacro(CacheCellBounds,int);
00095   vtkBooleanMacro(CacheCellBounds,int);
00096 
00099   virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00100             float& t, float x[3], float pcoords[3],
00101             int &subId);
00102 
00105   virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00106             float& t, float x[3], float pcoords[3],
00107             int &subId, int &cellId);
00108 
00112   virtual int IntersectWithLine(float a0[3], float a1[3], float tol,
00113             float& t, float x[3], float pcoords[3],
00114             int &subId, int &cellId, vtkGenericCell *cell);
00115 
00119   void FindClosestPoint(float x[3], float closestPoint[3], int &cellId,
00120          int &subId, float& dist2);
00121   
00131   void FindClosestPoint(float x[3], float closestPoint[3],
00132          vtkGenericCell *cell, int &cellId, int &subId,
00133          float& dist2);
00134   
00141   int FindClosestPointWithinRadius(float x[3], float radius,
00142                float closestPoint[3], int &cellId,
00143                int &subId, float& dist2);
00144  
00158   int FindClosestPointWithinRadius(float x[3], float radius,
00159                float closestPoint[3],
00160                vtkGenericCell *cell, int &cellId,
00161                int &subId, float& dist2);
00162 
00178   int FindClosestPointWithinRadius(float x[3], float radius,
00179                float closestPoint[3],
00180                vtkGenericCell *cell, int &cellId,
00181                int &subId, float& dist2, int &inside);
00182   
00184   virtual vtkIdList *GetCells(int bucket);
00185 
00188   virtual int GetNumberOfBuckets(void);
00189 
00191   void FreeSearchStructure();
00192   void BuildLocator();
00193   void GenerateRepresentation(int level, vtkPolyData *pd);
00194   
00195 protected:
00196   vtkCellLocator();
00197   ~vtkCellLocator();
00198   vtkCellLocator(const vtkCellLocator&) {};
00199   void operator=(const vtkCellLocator&) {};
00200 
00201   void GetBucketNeighbors(int ijk[3], int ndivs, int level);
00202   void GetOverlappingBuckets(float x[3], int ijk[3], float dist, 
00203                              int prevMinLevel[3], int prevMaxLevel[3]);
00204 
00205   void ClearCellHasBeenVisited();
00206   void ClearCellHasBeenVisited(int id);
00207 
00208   float Distance2ToBucket(float x[3], int nei[3]);
00209   float Distance2ToBounds(float x[3], float bounds[6]);
00210   
00211   int NumberOfCellsPerBucket; 
00212   int NumberOfOctants; 
00213   float Bounds[6]; 
00214   int NumberOfParents; 
00215   float H[3]; 
00216   int NumberOfDivisions; 
00217   vtkIdList **Tree; 
00218 
00219   void MarkParents(void*, int, int, int, int, int);
00220   void GetChildren(int idx, int level, int children[8]);
00221   int GenerateIndex(int offset, int numDivs, int i, int j, int k, int &idx);
00222   void GenerateFace(int face, int numDivs, int i, int j, int k,
00223                     vtkPoints *pts, vtkCellArray *polys);
00224 
00225   vtkNeighborCells *Buckets;
00226   unsigned char *CellHasBeenVisited;
00227   unsigned char QueryNumber;
00228   int CacheCellBounds;
00229 
00230   float (*CellBounds)[6];
00231 
00232 };
00233 
00234 #endif
00235 
00236