00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00085 #ifndef __vtkDecimatePro_h
00086 #define __vtkDecimatePro_h
00087
00088 #include "vtkPolyDataAlgorithm.h"
00089
00090 #include "vtkCell.h"
00091
00092 class vtkDoubleArray;
00093 class vtkPriorityQueue;
00094
00095 class VTK_GRAPHICS_EXPORT vtkDecimatePro : public vtkPolyDataAlgorithm
00096 {
00097 public:
00098 vtkTypeMacro(vtkDecimatePro,vtkPolyDataAlgorithm);
00099 void PrintSelf(ostream& os, vtkIndent indent);
00100
00107 static vtkDecimatePro *New();
00108
00110
00118 vtkSetClampMacro(TargetReduction,double,0.0,1.0);
00119 vtkGetMacro(TargetReduction,double);
00121
00123
00126 vtkSetMacro(PreserveTopology,int);
00127 vtkGetMacro(PreserveTopology,int);
00128 vtkBooleanMacro(PreserveTopology,int);
00130
00132
00135 vtkSetClampMacro(FeatureAngle,double,0.0,180.0);
00136 vtkGetMacro(FeatureAngle,double);
00138
00140
00144 vtkSetMacro(Splitting,int);
00145 vtkGetMacro(Splitting,int);
00146 vtkBooleanMacro(Splitting,int);
00148
00150
00153 vtkSetClampMacro(SplitAngle,double,0.0,180.0);
00154 vtkGetMacro(SplitAngle,double);
00156
00158
00164 vtkSetMacro(PreSplitMesh,int);
00165 vtkGetMacro(PreSplitMesh,int);
00166 vtkBooleanMacro(PreSplitMesh,int);
00168
00170
00174 vtkSetClampMacro(MaximumError,double,0.0,VTK_DOUBLE_MAX);
00175 vtkGetMacro(MaximumError,double);
00177
00179
00186 vtkSetMacro(AccumulateError,int);
00187 vtkGetMacro(AccumulateError,int);
00188 vtkBooleanMacro(AccumulateError,int);
00190
00192
00196 vtkSetMacro(ErrorIsAbsolute,int);
00197 vtkGetMacro(ErrorIsAbsolute,int);
00199
00201
00202 vtkSetClampMacro(AbsoluteError,double,0.0,VTK_DOUBLE_MAX);
00203 vtkGetMacro(AbsoluteError,double);
00205
00207
00209 vtkSetMacro(BoundaryVertexDeletion,int);
00210 vtkGetMacro(BoundaryVertexDeletion,int);
00211 vtkBooleanMacro(BoundaryVertexDeletion,int);
00213
00215
00219 vtkSetClampMacro(Degree,int,25,VTK_CELL_SIZE);
00220 vtkGetMacro(Degree,int);
00222
00224
00227 vtkSetClampMacro(InflectionPointRatio,double,1.001,VTK_DOUBLE_MAX);
00228 vtkGetMacro(InflectionPointRatio,double);
00230
00231
00237 vtkIdType GetNumberOfInflectionPoints();
00238
00243 void GetInflectionPoints(double *inflectionPoints);
00244
00250 double *GetInflectionPoints();
00251
00252 protected:
00253 vtkDecimatePro();
00254 ~vtkDecimatePro();
00255
00256 int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00257
00258 double TargetReduction;
00259 double FeatureAngle;
00260 double MaximumError;
00261 double AbsoluteError;
00262 int ErrorIsAbsolute;
00263 int AccumulateError;
00264 double SplitAngle;
00265 int Splitting;
00266 int PreSplitMesh;
00267 int BoundaryVertexDeletion;
00268 int PreserveTopology;
00269 int Degree;
00270 double InflectionPointRatio;
00271 vtkDoubleArray *InflectionPoints;
00272
00273
00274 vtkIdList *Neighbors;
00275 vtkPriorityQueue *EdgeLengths;
00276
00277 void SplitMesh();
00278 int EvaluateVertex(vtkIdType ptId, unsigned short int numTris,
00279 vtkIdType *tris, vtkIdType fedges[2]);
00280 vtkIdType FindSplit(int type, vtkIdType fedges[2], vtkIdType& pt1,
00281 vtkIdType& pt2, vtkIdList *CollapseTris);
00282 int IsValidSplit(int index);
00283 void SplitLoop(vtkIdType fedges[2], vtkIdType& n1, vtkIdType *l1,
00284 vtkIdType& n2, vtkIdType *l2);
00285 void SplitVertex(vtkIdType ptId,int type, unsigned short int numTris,
00286 vtkIdType *tris, int insert);
00287 int CollapseEdge(int type, vtkIdType ptId, vtkIdType collapseId,
00288 vtkIdType pt1, vtkIdType pt2, vtkIdList *CollapseTris);
00289 void DistributeError(double error);
00290
00291
00292
00293
00294
00295
00296
00297 class LocalVertex
00298 {
00299 public:
00300 vtkIdType id;
00301 double x[3];
00302 double FAngle;
00303 };
00304 typedef LocalVertex *LocalVertexPtr;
00305
00306 class LocalTri
00307 {
00308 public:
00309 vtkIdType id;
00310 double area;
00311 double n[3];
00312 vtkIdType verts[3];
00313 };
00314 typedef LocalTri *LocalTriPtr;
00315
00316 class VertexArray;
00317 friend class VertexArray;
00318 class VertexArray {
00319 public:
00320 VertexArray(const vtkIdType sz)
00321 {this->MaxId = -1; this->Array = new LocalVertex[sz];};
00322 ~VertexArray()
00323 {
00324 if (this->Array)
00325 {
00326 delete [] this->Array;
00327 }
00328 };
00329 vtkIdType GetNumberOfVertices() {return this->MaxId + 1;};
00330 void InsertNextVertex(LocalVertex& v)
00331 {this->MaxId++; this->Array[this->MaxId] = v;};
00332 LocalVertex& GetVertex(vtkIdType i) {return this->Array[i];};
00333 void Reset() {this->MaxId = -1;};
00334
00335 LocalVertex *Array;
00336 vtkIdType MaxId;
00337 };
00338
00339 class TriArray;
00340 friend class TriArray;
00341 class TriArray {
00342 public:
00343 TriArray(const vtkIdType sz)
00344 {this->MaxId = -1; this->Array = new LocalTri[sz];};
00345 ~TriArray()
00346 {
00347 if (this->Array)
00348 {
00349 delete [] this->Array;
00350 }
00351 };
00352 vtkIdType GetNumberOfTriangles() {return this->MaxId + 1;};
00353 void InsertNextTriangle(LocalTri& t)
00354 {this->MaxId++; this->Array[this->MaxId] = t;};
00355 LocalTri& GetTriangle(vtkIdType i) {return this->Array[i];};
00356 void Reset() {this->MaxId = -1;};
00357
00358 LocalTri *Array;
00359 vtkIdType MaxId;
00360 };
00361
00362
00363
00364 private:
00365 void InitializeQueue(vtkIdType numPts);
00366 void DeleteQueue();
00367 void Insert(vtkIdType id, double error= -1.0);
00368 int Pop(double &error);
00369 double DeleteId(vtkIdType id);
00370 void Reset();
00371
00372 vtkPriorityQueue *Queue;
00373 vtkDoubleArray *VertexError;
00374
00375 VertexArray *V;
00376 TriArray *T;
00377
00378
00379 vtkPolyData *Mesh;
00380 double Pt[3];
00381 double Normal[3];
00382 double LoopArea;
00383 double CosAngle;
00384 double Tolerance;
00385 double X[3];
00386 int NumCollapses;
00387 int NumMerges;
00388 int Split;
00389 int VertexDegree;
00390 vtkIdType NumberOfRemainingTris;
00391 double TheSplitAngle;
00392 int SplitState;
00393 double Error;
00394
00395 private:
00396 vtkDecimatePro(const vtkDecimatePro&);
00397 void operator=(const vtkDecimatePro&);
00398 };
00399
00400 #endif
00401
00402