• Main Page
  • Related Pages
  • Namespaces
  • Classes
  • Files
  • File List
  • File Members

dox/Graphics/vtkDecimatePro.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkDecimatePro.h,v $
00005 
00006   Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
00007   All rights reserved.
00008   See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
00009 
00010      This software is distributed WITHOUT ANY WARRANTY; without even
00011      the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012      PURPOSE.  See the above copyright notice for more information.
00013 
00014 =========================================================================*/
00082 #ifndef __vtkDecimatePro_h
00083 #define __vtkDecimatePro_h
00084 
00085 #include "vtkPolyDataAlgorithm.h"
00086 
00087 #include "vtkCell.h" // Needed for VTK_CELL_SIZE
00088 
00089 class vtkDoubleArray;
00090 class vtkPriorityQueue;
00091 
00092 class VTK_GRAPHICS_EXPORT vtkDecimatePro : public vtkPolyDataAlgorithm
00093 {
00094 public:
00095   vtkTypeRevisionMacro(vtkDecimatePro,vtkPolyDataAlgorithm);
00096   void PrintSelf(ostream& os, vtkIndent indent);
00097 
00104   static vtkDecimatePro *New();
00105 
00107 
00115   vtkSetClampMacro(TargetReduction,double,0.0,1.0);
00116   vtkGetMacro(TargetReduction,double);
00118 
00120 
00123   vtkSetMacro(PreserveTopology,int);
00124   vtkGetMacro(PreserveTopology,int);
00125   vtkBooleanMacro(PreserveTopology,int);
00127 
00129 
00132   vtkSetClampMacro(FeatureAngle,double,0.0,180.0);
00133   vtkGetMacro(FeatureAngle,double);
00135 
00137 
00141   vtkSetMacro(Splitting,int);
00142   vtkGetMacro(Splitting,int);
00143   vtkBooleanMacro(Splitting,int);
00145 
00147 
00150   vtkSetClampMacro(SplitAngle,double,0.0,180.0);
00151   vtkGetMacro(SplitAngle,double);
00153 
00155 
00161   vtkSetMacro(PreSplitMesh,int);
00162   vtkGetMacro(PreSplitMesh,int);
00163   vtkBooleanMacro(PreSplitMesh,int);
00165 
00167 
00171   vtkSetClampMacro(MaximumError,double,0.0,VTK_DOUBLE_MAX);
00172   vtkGetMacro(MaximumError,double);
00174 
00176 
00183   vtkSetMacro(AccumulateError,int);
00184   vtkGetMacro(AccumulateError,int);
00185   vtkBooleanMacro(AccumulateError,int);
00187 
00189 
00193   vtkSetMacro(ErrorIsAbsolute,int);
00194   vtkGetMacro(ErrorIsAbsolute,int);
00196 
00198 
00199   vtkSetClampMacro(AbsoluteError,double,0.0,VTK_DOUBLE_MAX);
00200   vtkGetMacro(AbsoluteError,double);
00202 
00204 
00206   vtkSetMacro(BoundaryVertexDeletion,int);
00207   vtkGetMacro(BoundaryVertexDeletion,int);
00208   vtkBooleanMacro(BoundaryVertexDeletion,int);
00210 
00212 
00216   vtkSetClampMacro(Degree,int,25,VTK_CELL_SIZE);
00217   vtkGetMacro(Degree,int);
00219   
00221 
00224   vtkSetClampMacro(InflectionPointRatio,double,1.001,VTK_DOUBLE_MAX);
00225   vtkGetMacro(InflectionPointRatio,double);
00227 
00228 
00234   vtkIdType GetNumberOfInflectionPoints();
00235 
00240   void GetInflectionPoints(double *inflectionPoints);
00241 
00247   double *GetInflectionPoints();
00248 
00249 protected:
00250   vtkDecimatePro();
00251   ~vtkDecimatePro();
00252 
00253   int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00254 
00255   double TargetReduction;
00256   double FeatureAngle;
00257   double MaximumError;
00258   double AbsoluteError;
00259   int ErrorIsAbsolute;
00260   int AccumulateError;
00261   double SplitAngle;
00262   int Splitting;
00263   int PreSplitMesh;
00264   int BoundaryVertexDeletion;
00265   int PreserveTopology;
00266   int Degree;
00267   double InflectionPointRatio;
00268   vtkDoubleArray *InflectionPoints;
00269 
00270   // to replace a static object
00271   vtkIdList *Neighbors;
00272   vtkPriorityQueue *EdgeLengths;
00273 
00274   void SplitMesh();
00275   int EvaluateVertex(vtkIdType ptId, unsigned short int numTris,
00276                      vtkIdType *tris, vtkIdType fedges[2]);
00277   vtkIdType FindSplit(int type, vtkIdType fedges[2], vtkIdType& pt1,
00278                       vtkIdType& pt2, vtkIdList *CollapseTris);
00279   int IsValidSplit(int index);
00280   void SplitLoop(vtkIdType fedges[2], vtkIdType& n1, vtkIdType *l1,
00281                  vtkIdType& n2, vtkIdType *l2);
00282   void SplitVertex(vtkIdType ptId,int type, unsigned short int numTris,
00283                    vtkIdType *tris, int insert);
00284   int CollapseEdge(int type, vtkIdType ptId, vtkIdType collapseId,
00285                    vtkIdType pt1, vtkIdType pt2, vtkIdList *CollapseTris);
00286   void DistributeError(double error);
00287 
00288   //
00289   // Special classes for manipulating data
00290   //
00291   //BTX - begin tcl exclude
00292   //
00293   // Special structures for building loops
00294   class LocalVertex
00295   {
00296   public:
00297     vtkIdType     id;
00298     double   x[3];
00299     double   FAngle;
00300   };
00301   typedef LocalVertex *LocalVertexPtr;
00302     
00303   class LocalTri
00304   {
00305   public:
00306     vtkIdType     id;
00307     double   area;
00308     double   n[3];
00309     vtkIdType     verts[3];
00310   };
00311   typedef LocalTri *LocalTriPtr;
00312 
00313   class VertexArray;
00314   friend class VertexArray;
00315   class VertexArray { //;prevent man page generation
00316   public:
00317     VertexArray(const vtkIdType sz) 
00318       {this->MaxId = -1; this->Array = new LocalVertex[sz];};
00319     ~VertexArray()
00320       {
00321         if (this->Array)
00322           {
00323           delete [] this->Array;
00324           }
00325       };
00326     vtkIdType GetNumberOfVertices() {return this->MaxId + 1;};
00327     void InsertNextVertex(LocalVertex& v) 
00328       {this->MaxId++; this->Array[this->MaxId] = v;};
00329     LocalVertex& GetVertex(vtkIdType i) {return this->Array[i];};
00330     void Reset() {this->MaxId = -1;};
00331 
00332     LocalVertex *Array; // pointer to data
00333     vtkIdType MaxId;             // maximum index inserted thus far
00334   };
00335 
00336   class TriArray;
00337   friend class TriArray;
00338   class TriArray { //;prevent man page generation
00339   public:
00340     TriArray(const vtkIdType sz) 
00341       {this->MaxId = -1; this->Array = new LocalTri[sz];};
00342     ~TriArray()
00343       {
00344         if (this->Array)
00345           {
00346           delete [] this->Array;
00347           }
00348       };
00349     vtkIdType GetNumberOfTriangles() {return this->MaxId + 1;};
00350     void InsertNextTriangle(LocalTri& t) 
00351       {this->MaxId++; this->Array[this->MaxId] = t;};
00352     LocalTri& GetTriangle(vtkIdType i) {return this->Array[i];};
00353     void Reset() {this->MaxId = -1;};
00354 
00355     LocalTri *Array;  // pointer to data
00356     vtkIdType MaxId;           // maximum index inserted thus far
00357   };
00358   //ETX - end tcl exclude
00359   //
00360 
00361 private:
00362   void InitializeQueue(vtkIdType numPts);
00363   void DeleteQueue();
00364   void Insert(vtkIdType id, double error= -1.0);
00365   int Pop(double &error);
00366   double DeleteId(vtkIdType id);
00367   void Reset();
00368 
00369   vtkPriorityQueue *Queue;
00370   vtkDoubleArray *VertexError;
00371 
00372   VertexArray *V;
00373   TriArray *T;
00374 
00375   // Use to be static variables used by object
00376   vtkPolyData *Mesh; //operate on this data structure
00377   double Pt[3];      //least squares plane point
00378   double Normal[3];  //least squares plane normal
00379   double LoopArea;   //the total area of all triangles in a loop
00380   double CosAngle;   //Cosine of dihedral angle
00381   double Tolerance;  //Intersection tolerance
00382   double X[3];       //coordinates of current point
00383   int NumCollapses; //Number of times edge collapses occur
00384   int NumMerges;    //Number of times vertex merges occur
00385   int Split;        //Controls whether and when vertex splitting occurs
00386   int VertexDegree; //Maximum number of triangles that can use a vertex
00387   vtkIdType NumberOfRemainingTris; //Number of triangles left in the mesh
00388   double TheSplitAngle; //Split angle
00389   int SplitState;   //State of the splitting process
00390   double Error;      //Maximum allowable surface error
00391 
00392 private:
00393   vtkDecimatePro(const vtkDecimatePro&);  // Not implemented.
00394   void operator=(const vtkDecimatePro&);  // Not implemented.
00395 };
00396 
00397 #endif
00398 
00399 

Generated by  doxygen 1.7.1