00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
00222 struct ErrorQuadric
00223 {
00224 double *Quadric;
00225 };
00226
00227
00228 ErrorQuadric *ErrorQuadrics;
00229 int AttributeComponents[6];
00230 double AttributeScale[6];
00231
00232
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&);
00242 void operator=(const vtkQuadricDecimation&);
00243 };
00244
00245 #endif