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