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 
00131 #ifndef __vtkDelaunay2D_h
00132 #define __vtkDelaunay2D_h
00133 
00134 #include "vtkPointSet.h"
00135 #include "vtkPolyDataSource.h"
00136 
00137 class VTK_EXPORT vtkDelaunay2D : public vtkPolyDataSource
00138 {
00139 public:
00140   vtkTypeMacro(vtkDelaunay2D,vtkPolyDataSource);
00141   void PrintSelf(ostream& os, vtkIndent indent);
00142 
00145   static vtkDelaunay2D *New();
00146 
00150   void SetSource(vtkPolyData *);
00151   vtkPolyData *GetSource();
00152   
00157   vtkSetClampMacro(Alpha,double,0.0,VTK_LARGE_FLOAT);
00158   vtkGetMacro(Alpha,double);
00159 
00163   vtkSetClampMacro(Tolerance,double,0.0,1.0);
00164   vtkGetMacro(Tolerance,double);
00165 
00168   vtkSetClampMacro(Offset,double,0.75,VTK_LARGE_FLOAT);
00169   vtkGetMacro(Offset,double);
00170 
00175   vtkSetMacro(BoundingTriangulation,int);
00176   vtkGetMacro(BoundingTriangulation,int);
00177   vtkBooleanMacro(BoundingTriangulation,int);
00178 
00180   virtual void SetInput(vtkPointSet *input);
00181   vtkPointSet *GetInput();
00182 
00183 protected:
00184   vtkDelaunay2D();
00185   ~vtkDelaunay2D();
00186   vtkDelaunay2D(const vtkDelaunay2D&) {};
00187   void operator=(const vtkDelaunay2D&) {};
00188 
00189   void Execute();
00190 
00191   double Alpha;
00192   double Tolerance;
00193   int BoundingTriangulation;
00194   double Offset;
00195 
00196 private:
00197   vtkPolyData *Mesh; 
00198   double *Points;    
00199   void SetPoint(int id, double *x)
00200     {int idx=3*id; 
00201     this->Points[idx] = x[0];
00202     this->Points[idx+1] = x[1];
00203     this->Points[idx+2] = x[2];
00204     }
00205       
00206   void GetPoint(int id, double x[3])
00207     {double *ptr = this->Points + 3*id;
00208     x[0] = *ptr++;
00209     x[1] = *ptr++;
00210     x[2] = *ptr;
00211     }
00212 
00213   int NumberOfDuplicatePoints;
00214   int NumberOfDegeneracies;
00215 
00216   int *RecoverBoundary();
00217   int RecoverEdge(int p1, int p2);
00218   void FillPolygons(vtkCellArray *polys, int *triUse);
00219 
00220   int InCircle (double x[3], double x1[3], double x2[3], double x3[3]);
00221   int FindTriangle(double x[3], int ptIds[3], int tri, double tol, 
00222                    int nei[3], vtkIdList *neighbors);
00223   void CheckEdge(int ptId, double x[3], int p1, int p2, int tri);
00224 
00225 };
00226 
00227 #endif
00228 
00229