Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members   Related Pages  

Common/vtkPointLocator.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkPointLocator.h,v $
00005   Language:  C++
00006 
00007   Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 
00008   All rights reserved.
00009   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00010 
00011      This software is distributed WITHOUT ANY WARRANTY; without even 
00012      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
00013      PURPOSE.  See the above copyright notice for more information.
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   // place points in appropriate buckets
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; // Used for merging points
00244   int Divisions[3]; // Number of sub-divisions in x-y-z directions
00245   int NumberOfPointsPerBucket; //Used with previous boolean to control subdivide
00246   float Bounds[6]; // bounds of points
00247   vtkIdList **HashTable; // lists of point ids in buckets
00248   vtkIdType NumberOfBuckets; // total size of hash table
00249   float H[3]; // width of each bucket in x-y-z directions
00250 
00251   float InsertionTol2;
00252   vtkIdType InsertionPointId;
00253 
00254   float InsertionLevel; 
00255 private:
00256   vtkPointLocator(const vtkPointLocator&);  // Not implemented.
00257   void operator=(const vtkPointLocator&);  // Not implemented.
00258 };
00259 
00260 #endif
00261 
00262