00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
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
00233 struct ErrorQuadric
00234 {
00235 double *Quadric;
00236 };
00237
00238
00239 ErrorQuadric *ErrorQuadrics;
00240 int AttributeComponents[6];
00241 double AttributeScale[6];
00242
00243
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&);
00253 void operator=(const vtkQuadricDecimation&);
00254 };
00255
00256 #endif