00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00060 #ifndef __vtkPointLocator_h
00061 #define __vtkPointLocator_h
00062
00063 #include "vtkLocator.h"
00064
00065 class vtkCellArray;
00066 class vtkIdList;
00067 class vtkNeighborPoints;
00068 class vtkPoints;
00069
00070 class VTK_COMMON_EXPORT vtkPointLocator : public vtkLocator
00071 {
00072 public:
00075 static vtkPointLocator *New();
00076
00077 vtkTypeRevisionMacro(vtkPointLocator,vtkLocator);
00078 void PrintSelf(ostream& os, vtkIndent indent);
00079
00081
00082 vtkSetVector3Macro(Divisions,int);
00083 vtkGetVectorMacro(Divisions,int,3);
00085
00087
00088 vtkSetClampMacro(NumberOfPointsPerBucket,int,1,VTK_LARGE_INTEGER);
00089 vtkGetMacro(NumberOfPointsPerBucket,int);
00091
00093
00097 virtual vtkIdType FindClosestPoint(const float x[3]);
00098 vtkIdType FindClosestPoint(float x, float y, float z);
00100
00102
00106 vtkIdType FindClosestPointWithinRadius(float radius, const float x[3],
00107 float& dist2);
00108 vtkIdType FindClosestPointWithinRadius(float radius, const float x[3],
00109 float inputDataLength, float& dist2);
00111
00116 virtual int InitPointInsertion(vtkPoints *newPts, const float bounds[6]);
00117
00119
00123 virtual int InitPointInsertion(vtkPoints *newPts, const float bounds[6],
00124 vtkIdType estSize);
00126
00134 virtual void InsertPoint(vtkIdType ptId, const float x[3]);
00135
00143 virtual vtkIdType InsertNextPoint(const float x[3]);
00144
00146
00149 vtkIdType IsInsertedPoint(float x, float y, float z)
00150 {
00151 float xyz[3];
00152 xyz[0] = x; xyz[1] = y; xyz[2] = z;
00153 return this->IsInsertedPoint (xyz);
00154 };
00155 virtual vtkIdType IsInsertedPoint(const float x[3]);
00157
00165 virtual int InsertUniquePoint(const float x[3], vtkIdType &ptId);
00166
00172 virtual vtkIdType FindClosestInsertedPoint(const float x[3]);
00173
00175
00181 virtual void FindClosestNPoints(int N, const float x[3], vtkIdList *result);
00182 virtual void FindClosestNPoints(int N, float x, float y, float z,
00183 vtkIdList *result);
00185
00187
00192 virtual void FindDistributedPoints(int N, const float x[3],
00193 vtkIdList *result, int M);
00194 virtual void FindDistributedPoints(int N, float x, float y,
00195 float z, vtkIdList *result, int M);
00197
00199
00203 virtual void FindPointsWithinRadius(float R, const float x[3],
00204 vtkIdList *result);
00205 virtual void FindPointsWithinRadius(float R, float x, float y, float z,
00206 vtkIdList *result);
00208
00213 virtual vtkIdList *GetPointsInBucket(const float x[3], int ijk[3]);
00214
00216
00218 void Initialize();
00219 void FreeSearchStructure();
00220 void BuildLocator();
00221 void GenerateRepresentation(int level, vtkPolyData *pd);
00223
00224 protected:
00225 vtkPointLocator();
00226 ~vtkPointLocator();
00227
00228
00229 void GetBucketNeighbors(vtkNeighborPoints* buckets,
00230 const int ijk[3], const int ndivs[3], int level);
00231 void GetOverlappingBuckets(vtkNeighborPoints* buckets,
00232 const float x[3], const int ijk[3], float dist,
00233 int level);
00234 void GetOverlappingBuckets(vtkNeighborPoints* buckets,
00235 const float x[3], float dist,
00236 int prevMinLevel[3],
00237 int prevMaxLevel[3]);
00238 void GenerateFace(int face, int i, int j, int k,
00239 vtkPoints *pts, vtkCellArray *polys);
00240 float Distance2ToBucket(const float x[3], const int nei[3]);
00241 float Distance2ToBounds(const float x[3], const float bounds[6]);
00242
00243 vtkPoints *Points;
00244 int Divisions[3];
00245 int NumberOfPointsPerBucket;
00246 float Bounds[6];
00247 vtkIdList **HashTable;
00248 vtkIdType NumberOfBuckets;
00249 float H[3];
00250
00251 float InsertionTol2;
00252 vtkIdType InsertionPointId;
00253
00254 float InsertionLevel;
00255 private:
00256 vtkPointLocator(const vtkPointLocator&);
00257 void operator=(const vtkPointLocator&);
00258 };
00259
00260 #endif
00261
00262