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

Graphics/vtkQuadricDecimation.h

Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    $RCSfile: vtkQuadricDecimation.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 =========================================================================*/
00073 #ifndef __vtkQuadricDecimation_h
00074 #define __vtkQuadricDecimation_h
00075 
00076 #include "vtkPolyDataToPolyDataFilter.h"
00077 
00078 class vtkEdgeTable;
00079 class vtkIdList;
00080 class vtkPointData;
00081 class vtkPriorityQueue;
00082 class vtkFloatArray;
00083 
00084 class VTK_GRAPHICS_EXPORT vtkQuadricDecimation : public vtkPolyDataToPolyDataFilter
00085 {
00086 public:
00087   vtkTypeRevisionMacro(vtkQuadricDecimation, vtkPolyDataToPolyDataFilter);
00088   void PrintSelf(ostream& os, vtkIndent indent);
00089   static vtkQuadricDecimation *New();
00090 
00092 
00095   vtkSetClampMacro(TargetReduction, float, 0.0, 1.0);
00096   vtkGetMacro(TargetReduction, float);
00098 
00100 
00103   vtkSetMacro(AttributeErrorMetric, int);
00104   vtkGetMacro(AttributeErrorMetric, int);
00105   vtkBooleanMacro(AttributeErrorMetric, int);
00107   
00109 
00113   vtkSetMacro(ScalarsAttribute, int);
00114   vtkGetMacro(ScalarsAttribute, int);
00115   vtkBooleanMacro(ScalarsAttribute, int);
00116   vtkSetMacro(VectorsAttribute, int);
00117   vtkGetMacro(VectorsAttribute, int);
00118   vtkBooleanMacro(VectorsAttribute, int);
00119   vtkSetMacro(NormalsAttribute, int);
00120   vtkGetMacro(NormalsAttribute, int);
00121   vtkBooleanMacro(NormalsAttribute, int);
00122   vtkSetMacro(TCoordsAttribute, int);
00123   vtkGetMacro(TCoordsAttribute, int);
00124   vtkBooleanMacro(TCoordsAttribute, int);
00125   vtkSetMacro(TensorsAttribute, int);
00126   vtkGetMacro(TensorsAttribute, int);
00127   vtkBooleanMacro(TensorsAttribute, int);
00129 
00131 
00134   vtkSetMacro(ScalarsWeight, float);
00135   vtkSetMacro(VectorsWeight, float);
00136   vtkSetMacro(NormalsWeight, float);
00137   vtkSetMacro(TCoordsWeight, float);
00138   vtkSetMacro(TensorsWeight, float);
00139   vtkGetMacro(ScalarsWeight, float);
00140   vtkGetMacro(VectorsWeight, float);
00141   vtkGetMacro(NormalsWeight, float);
00142   vtkGetMacro(TCoordsWeight, float);
00143   vtkGetMacro(TensorsWeight, float);
00145   
00147 
00149   vtkGetMacro(ActualReduction, float);
00151 
00152 protected:
00153   vtkQuadricDecimation();
00154   ~vtkQuadricDecimation();
00155 
00156   void Execute();
00157 
00160   int CollapseEdge(vtkIdType pt0Id, vtkIdType pt1Id);
00161 
00163   void InitializeQuadrics(vtkIdType numPts);
00164   
00166   void AddBoundaryConstraints(void);
00167 
00169   void ComputeQuadric(vtkIdType pointId);
00170 
00173   void AddQuadric(vtkIdType oldPtId, vtkIdType newPtId);
00174   
00176 
00178   double ComputeCost(vtkIdType edgeId, double *x);
00179   double ComputeCost2(vtkIdType edgeId, double *x);
00181 
00185   void FindAffectedEdges(vtkIdType p1Id, vtkIdType p2Id, vtkIdList *edges);
00186   
00188   vtkIdType GetEdgeCellId(vtkIdType p1Id, vtkIdType p2Id);
00189 
00190   int IsGoodPlacement(vtkIdType pt0Id, vtkIdType pt1Id, const double *x);
00191   int TrianglePlaneCheck(const float t0[3], const float t1[3], 
00192                          const float t2[3],  const double *x);
00193   void ComputeNumberOfComponents(void);
00194   void UpdateEdgeData(vtkIdType ptoId, vtkIdType pt1Id);
00195   
00197 
00199   void SetPointAttributeArray(vtkIdType ptId, const double *x);
00200   void GetPointAttributeArray(vtkIdType ptId, double *x);
00202 
00205   void GetAttributeComponents();
00206   
00207   float TargetReduction;
00208   float ActualReduction;
00209   int   AttributeErrorMetric;
00210   
00211   int ScalarsAttribute;
00212   int VectorsAttribute;
00213   int NormalsAttribute;
00214   int TCoordsAttribute;
00215   int TensorsAttribute;
00216 
00217   float ScalarsWeight;
00218   float VectorsWeight;
00219   float NormalsWeight;
00220   float TCoordsWeight;
00221   float TensorsWeight;
00222 
00223   int               NumberOfEdgeCollapses;
00224   vtkEdgeTable     *Edges;
00225   vtkIdList        *EndPoint1List;
00226   vtkIdList        *EndPoint2List;
00227   vtkPriorityQueue *EdgeCosts;
00228   vtkFloatArray    *TargetPoints;
00229   int               NumberOfComponents;
00230   vtkPolyData      *Mesh;
00231 
00232   //BTX
00233   struct ErrorQuadric
00234   {
00235     double *Quadric;
00236   };
00237   //ETX
00238 
00239   ErrorQuadric *ErrorQuadrics;
00240   int           AttributeComponents[6];
00241   double        AttributeScale[6];
00242   
00243   // Temporary variables for performance
00244   vtkIdList *CollapseCellIds;
00245   double *TempX;
00246   double *TempQuad;
00247   double *TempB;
00248   double **TempA;
00249   double *TempData;
00250 
00251 private:
00252   vtkQuadricDecimation(const vtkQuadricDecimation&);  // Not implemented.
00253   void operator=(const vtkQuadricDecimation&);  // Not implemented.
00254 };
00255 
00256 #endif