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 =========================================================================*/
00062 #ifndef __vtkQuadricDecimation_h
00063 #define __vtkQuadricDecimation_h
00064 
00065 #include "vtkPolyDataToPolyDataFilter.h"
00066 
00067 class vtkEdgeTable;
00068 class vtkIdList;
00069 class vtkPointData;
00070 class vtkPriorityQueue;
00071 class vtkFloatArray;
00072 
00073 class VTK_GRAPHICS_EXPORT vtkQuadricDecimation : public vtkPolyDataToPolyDataFilter
00074 {
00075 public:
00076   vtkTypeRevisionMacro(vtkQuadricDecimation, vtkPolyDataToPolyDataFilter);
00077   void PrintSelf(ostream& os, vtkIndent indent);
00078   static vtkQuadricDecimation *New();
00079 
00081 
00084   vtkSetClampMacro(TargetReduction, float, 0.0, 1.0);
00085   vtkGetMacro(TargetReduction, float);
00087 
00089 
00092   vtkSetMacro(AttributeErrorMetric, int);
00093   vtkGetMacro(AttributeErrorMetric, int);
00094   vtkBooleanMacro(AttributeErrorMetric, int);
00096   
00098 
00102   vtkSetMacro(ScalarsAttribute, int);
00103   vtkGetMacro(ScalarsAttribute, int);
00104   vtkBooleanMacro(ScalarsAttribute, int);
00105   vtkSetMacro(VectorsAttribute, int);
00106   vtkGetMacro(VectorsAttribute, int);
00107   vtkBooleanMacro(VectorsAttribute, int);
00108   vtkSetMacro(NormalsAttribute, int);
00109   vtkGetMacro(NormalsAttribute, int);
00110   vtkBooleanMacro(NormalsAttribute, int);
00111   vtkSetMacro(TCoordsAttribute, int);
00112   vtkGetMacro(TCoordsAttribute, int);
00113   vtkBooleanMacro(TCoordsAttribute, int);
00114   vtkSetMacro(TensorsAttribute, int);
00115   vtkGetMacro(TensorsAttribute, int);
00116   vtkBooleanMacro(TensorsAttribute, int);
00118 
00120 
00123   vtkSetMacro(ScalarsWeight, float);
00124   vtkSetMacro(VectorsWeight, float);
00125   vtkSetMacro(NormalsWeight, float);
00126   vtkSetMacro(TCoordsWeight, float);
00127   vtkSetMacro(TensorsWeight, float);
00128   vtkGetMacro(ScalarsWeight, float);
00129   vtkGetMacro(VectorsWeight, float);
00130   vtkGetMacro(NormalsWeight, float);
00131   vtkGetMacro(TCoordsWeight, float);
00132   vtkGetMacro(TensorsWeight, float);
00134   
00136 
00138   vtkGetMacro(ActualReduction, float);
00140 
00141 protected:
00142   vtkQuadricDecimation();
00143   ~vtkQuadricDecimation();
00144 
00145   void Execute();
00146 
00149   int CollapseEdge(vtkIdType pt0Id, vtkIdType pt1Id);
00150 
00152   void InitializeQuadrics(vtkIdType numPts);
00153   
00155   void AddBoundaryConstraints(void);
00156 
00158   void ComputeQuadric(vtkIdType pointId);
00159 
00162   void AddQuadric(vtkIdType oldPtId, vtkIdType newPtId);
00163   
00165 
00167   double ComputeCost(vtkIdType edgeId, double *x);
00168   double ComputeCost2(vtkIdType edgeId, double *x);
00170 
00174   void FindAffectedEdges(vtkIdType p1Id, vtkIdType p2Id, vtkIdList *edges);
00175   
00177   vtkIdType GetEdgeCellId(vtkIdType p1Id, vtkIdType p2Id);
00178 
00179   int IsGoodPlacement(vtkIdType pt0Id, vtkIdType pt1Id, const double *x);
00180   int TrianglePlaneCheck(const float t0[3], const float t1[3], 
00181                          const float t2[3],  const double *x);
00182   void ComputeNumberOfComponents(void);
00183   void UpdateEdgeData(vtkIdType ptoId, vtkIdType pt1Id);
00184   
00186 
00188   void SetPointAttributeArray(vtkIdType ptId, const double *x);
00189   void GetPointAttributeArray(vtkIdType ptId, double *x);
00191 
00194   void GetAttributeComponents();
00195   
00196   float TargetReduction;
00197   float ActualReduction;
00198   int   AttributeErrorMetric;
00199   
00200   int ScalarsAttribute;
00201   int VectorsAttribute;
00202   int NormalsAttribute;
00203   int TCoordsAttribute;
00204   int TensorsAttribute;
00205 
00206   float ScalarsWeight;
00207   float VectorsWeight;
00208   float NormalsWeight;
00209   float TCoordsWeight;
00210   float TensorsWeight;
00211 
00212   int               NumberOfEdgeCollapses;
00213   vtkEdgeTable     *Edges;
00214   vtkIdList        *EndPoint1List;
00215   vtkIdList        *EndPoint2List;
00216   vtkPriorityQueue *EdgeCosts;
00217   vtkFloatArray    *TargetPoints;
00218   int               NumberOfComponents;
00219   vtkPolyData      *Mesh;
00220 
00221   //BTX
00222   struct ErrorQuadric
00223   {
00224     double *Quadric;
00225   };
00226   //ETX
00227 
00228   ErrorQuadric *ErrorQuadrics;
00229   int           AttributeComponents[6];
00230   double        AttributeScale[6];
00231   
00232   // Temporary variables for performance
00233   vtkIdList *CollapseCellIds;
00234   double *TempX;
00235   double *TempQuad;
00236   double *TempB;
00237   double **TempA;
00238   double *TempData;
00239 
00240 private:
00241   vtkQuadricDecimation(const vtkQuadricDecimation&);  // Not implemented.
00242   void operator=(const vtkQuadricDecimation&);  // Not implemented.
00243 };
00244 
00245 #endif