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

dox/Graphics/vtkDecimatePro.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkDecimatePro.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 =========================================================================*/ 00089 #ifndef __vtkDecimatePro_h 00090 #define __vtkDecimatePro_h 00091 00092 #include "vtkPolyDataToPolyDataFilter.h" 00093 00094 #include "vtkCell.h" // Needed for VTK_CELL_SIZE 00095 00096 class vtkFloatArray; 00097 class vtkPriorityQueue; 00098 00099 class VTK_GRAPHICS_EXPORT vtkDecimatePro : public vtkPolyDataToPolyDataFilter 00100 { 00101 public: 00102 vtkTypeRevisionMacro(vtkDecimatePro,vtkPolyDataToPolyDataFilter); 00103 void PrintSelf(ostream& os, vtkIndent indent); 00104 00111 static vtkDecimatePro *New(); 00112 00114 00120 vtkSetClampMacro(TargetReduction,float,0.0,1.0); 00121 vtkGetMacro(TargetReduction,float); 00123 00125 00128 vtkSetMacro(PreserveTopology,int); 00129 vtkGetMacro(PreserveTopology,int); 00130 vtkBooleanMacro(PreserveTopology,int); 00132 00134 00137 vtkSetClampMacro(FeatureAngle,float,0.0,180.0); 00138 vtkGetMacro(FeatureAngle,float); 00140 00142 00146 vtkSetMacro(Splitting,int); 00147 vtkGetMacro(Splitting,int); 00148 vtkBooleanMacro(Splitting,int); 00150 00152 00155 vtkSetClampMacro(SplitAngle,float,0.0,180.0); 00156 vtkGetMacro(SplitAngle,float); 00158 00160 00166 vtkSetMacro(PreSplitMesh,int); 00167 vtkGetMacro(PreSplitMesh,int); 00168 vtkBooleanMacro(PreSplitMesh,int); 00170 00172 00176 vtkSetClampMacro(MaximumError,float,0.0,VTK_LARGE_FLOAT); 00177 vtkGetMacro(MaximumError,float); 00179 00181 00188 vtkSetMacro(AccumulateError,int); 00189 vtkGetMacro(AccumulateError,int); 00190 vtkBooleanMacro(AccumulateError,int); 00192 00194 00198 vtkSetMacro(ErrorIsAbsolute,int); 00199 vtkGetMacro(ErrorIsAbsolute,int); 00201 00203 00204 vtkSetClampMacro(AbsoluteError,float,0.0,VTK_LARGE_FLOAT); 00205 vtkGetMacro(AbsoluteError,float); 00207 00209 00211 vtkSetMacro(BoundaryVertexDeletion,int); 00212 vtkGetMacro(BoundaryVertexDeletion,int); 00213 vtkBooleanMacro(BoundaryVertexDeletion,int); 00215 00217 00221 vtkSetClampMacro(Degree,int,25,VTK_CELL_SIZE); 00222 vtkGetMacro(Degree,int); 00224 00226 00229 vtkSetClampMacro(InflectionPointRatio,float,1.001,VTK_LARGE_FLOAT); 00230 vtkGetMacro(InflectionPointRatio,float); 00232 00233 00239 vtkIdType GetNumberOfInflectionPoints(); 00240 00245 void GetInflectionPoints(float *inflectionPoints); 00246 00252 float *GetInflectionPoints(); 00253 00254 protected: 00255 vtkDecimatePro(); 00256 ~vtkDecimatePro(); 00257 00258 void Execute(); 00259 00260 float TargetReduction; 00261 float FeatureAngle; 00262 float MaximumError; 00263 float AbsoluteError; 00264 int ErrorIsAbsolute; 00265 int AccumulateError; 00266 float SplitAngle; 00267 int Splitting; 00268 int PreSplitMesh; 00269 int BoundaryVertexDeletion; 00270 int PreserveTopology; 00271 int Degree; 00272 float InflectionPointRatio; 00273 vtkFloatArray *InflectionPoints; 00274 00275 // to replace a static object 00276 vtkIdList *Neighbors; 00277 vtkPriorityQueue *EdgeLengths; 00278 00279 void SplitMesh(); 00280 int EvaluateVertex(vtkIdType ptId, unsigned short int numTris, 00281 vtkIdType *tris, vtkIdType fedges[2]); 00282 vtkIdType FindSplit(int type, vtkIdType fedges[2], vtkIdType& pt1, 00283 vtkIdType& pt2, vtkIdList *CollapseTris); 00284 int IsValidSplit(int index); 00285 void SplitLoop(vtkIdType fedges[2], vtkIdType& n1, vtkIdType *l1, 00286 vtkIdType& n2, vtkIdType *l2); 00287 void SplitVertex(vtkIdType ptId,int type, unsigned short int numTris, 00288 vtkIdType *tris, int insert); 00289 int CollapseEdge(int type, vtkIdType ptId, vtkIdType collapseId, 00290 vtkIdType pt1, vtkIdType pt2, vtkIdList *CollapseTris); 00291 void DistributeError(float error); 00292 00293 // 00294 // Special classes for manipulating data 00295 // 00296 //BTX - begin tcl exclude 00297 // 00298 // Special structures for building loops 00299 class LocalVertex 00300 { 00301 public: 00302 vtkIdType id; 00303 float x[3]; 00304 float FAngle; 00305 }; 00306 typedef LocalVertex *LocalVertexPtr; 00307 00308 class LocalTri 00309 { 00310 public: 00311 vtkIdType id; 00312 float area; 00313 float n[3]; 00314 vtkIdType verts[3]; 00315 }; 00316 typedef LocalTri *LocalTriPtr; 00317 00318 class VertexArray; 00319 friend class VertexArray; 00320 class VertexArray { //;prevent man page generation 00321 public: 00322 VertexArray(const vtkIdType sz) 00323 {this->MaxId = -1; this->Array = new LocalVertex[sz];}; 00324 ~VertexArray() 00325 { 00326 if (this->Array) 00327 { 00328 delete [] this->Array; 00329 } 00330 }; 00331 vtkIdType GetNumberOfVertices() {return this->MaxId + 1;}; 00332 void InsertNextVertex(LocalVertex& v) 00333 {this->MaxId++; this->Array[this->MaxId] = v;}; 00334 LocalVertex& GetVertex(vtkIdType i) {return this->Array[i];}; 00335 void Reset() {this->MaxId = -1;}; 00336 00337 LocalVertex *Array; // pointer to data 00338 vtkIdType MaxId; // maximum index inserted thus far 00339 }; 00340 00341 class TriArray; 00342 friend class TriArray; 00343 class TriArray { //;prevent man page generation 00344 public: 00345 TriArray(const vtkIdType sz) 00346 {this->MaxId = -1; this->Array = new LocalTri[sz];}; 00347 ~TriArray() 00348 { 00349 if (this->Array) 00350 { 00351 delete [] this->Array; 00352 } 00353 }; 00354 vtkIdType GetNumberOfTriangles() {return this->MaxId + 1;}; 00355 void InsertNextTriangle(LocalTri& t) 00356 {this->MaxId++; this->Array[this->MaxId] = t;}; 00357 LocalTri& GetTriangle(vtkIdType i) {return this->Array[i];}; 00358 void Reset() {this->MaxId = -1;}; 00359 00360 LocalTri *Array; // pointer to data 00361 vtkIdType MaxId; // maximum index inserted thus far 00362 }; 00363 //ETX - end tcl exclude 00364 // 00365 00366 private: 00367 void InitializeQueue(vtkIdType numPts); 00368 void DeleteQueue(); 00369 void Insert(vtkIdType id, float error= -1.0); 00370 int Pop(float &error); 00371 float DeleteId(vtkIdType id); 00372 void Reset(); 00373 00374 vtkPriorityQueue *Queue; 00375 vtkFloatArray *VertexError; 00376 00377 VertexArray *V; 00378 TriArray *T; 00379 00380 // Use to be static variables used by object 00381 vtkPolyData *Mesh; //operate on this data structure 00382 float Pt[3]; //least squares plane point 00383 float Normal[3]; //least squares plane normal 00384 float LoopArea; //the total area of all triangles in a loop 00385 float CosAngle; //Cosine of dihedral angle 00386 float Tolerance; //Intersection tolerance 00387 float X[3]; //coordinates of current point 00388 int NumCollapses; //Number of times edge collapses occur 00389 int NumMerges; //Number of times vertex merges occur 00390 int Split; //Controls whether and when vertex splitting occurs 00391 int VertexDegree; //Maximum number of triangles that can use a vertex 00392 vtkIdType NumberOfRemainingTris; //Number of triangles left in the mesh 00393 float TheSplitAngle; //Split angle 00394 int SplitState; //State of the splitting process 00395 float Error; //Maximum allowable surface error 00396 00397 private: 00398 vtkDecimatePro(const vtkDecimatePro&); // Not implemented. 00399 void operator=(const vtkDecimatePro&); // Not implemented. 00400 }; 00401 00402 #endif 00403 00404