00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00083
#ifndef __vtkQuadricClustering_h
00084
#define __vtkQuadricClustering_h
00085
00086
#include "vtkPolyDataToPolyDataFilter.h"
00087
00088
class vtkCellArray;
00089
class vtkFeatureEdges;
00090
class vtkPoints;
00091
00092 class VTK_GRAPHICS_EXPORT vtkQuadricClustering :
public vtkPolyDataToPolyDataFilter
00093 {
00094
public:
00095 vtkTypeRevisionMacro(vtkQuadricClustering,
vtkPolyDataToPolyDataFilter);
00096
void PrintSelf(ostream& os,
vtkIndent indent);
00097
static vtkQuadricClustering *
New();
00098
00100
00105
void SetNumberOfXDivisions(
int num);
00106
void SetNumberOfYDivisions(
int num);
00107
void SetNumberOfZDivisions(
int num);
00108 vtkGetMacro(NumberOfXDivisions,
int);
00109 vtkGetMacro(NumberOfYDivisions,
int);
00110 vtkGetMacro(NumberOfZDivisions,
int);
00111
void SetNumberOfDivisions(
int div[3]);
00112
int *GetNumberOfDivisions();
00113
void GetNumberOfDivisions(
int div[3]);
00115
00117
00120 vtkSetMacro(AutoAdjustNumberOfDivisions,
int);
00121 vtkGetMacro(AutoAdjustNumberOfDivisions,
int);
00122 vtkBooleanMacro(AutoAdjustNumberOfDivisions,
int);
00124
00126
00130
void SetDivisionOrigin(
float x,
float y,
float z);
00131 void SetDivisionOrigin(
float o[3])
00132 {this->SetDivisionOrigin(o[0],o[1],o[2]);}
00133 vtkGetVector3Macro(DivisionOrigin,
float);
00134
void SetDivisionSpacing(
float x,
float y,
float z);
00135 void SetDivisionSpacing(
float s[3])
00136 {this->SetDivisionSpacing(s[0],s[1],s[2]);}
00137 vtkGetVector3Macro(DivisionSpacing,
float);
00139
00141
00147 vtkSetMacro(UseInputPoints,
int);
00148 vtkGetMacro(UseInputPoints,
int);
00149 vtkBooleanMacro(UseInputPoints,
int);
00151
00153
00157 vtkSetMacro(UseFeatureEdges,
int);
00158 vtkGetMacro(UseFeatureEdges,
int);
00159 vtkBooleanMacro(UseFeatureEdges,
int);
00160 vtkFeatureEdges *GetFeatureEdges() {
return this->FeatureEdges;}
00162
00164
00169 vtkSetMacro(UseFeaturePoints,
int);
00170 vtkGetMacro(UseFeaturePoints,
int);
00171 vtkBooleanMacro(UseFeaturePoints,
int);
00173
00175
00177 vtkSetClampMacro(FeaturePointsAngle,
float, 0.0, 180.0);
00178 vtkGetMacro(FeaturePointsAngle,
float);
00180
00182
00186 vtkSetMacro(UseInternalTriangles,
int);
00187 vtkGetMacro(UseInternalTriangles,
int);
00188 vtkBooleanMacro(UseInternalTriangles,
int);
00190
00192
00196
void StartAppend(
float *bounds);
00197 void StartAppend(
float x0,
float x1,
float y0,
float y1,
float z0,
float z1)
00198 {
float b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1;
00199 this->StartAppend(b);}
00200
void Append(
vtkPolyData *piece);
00201
void EndAppend();
00203
00205
00209 vtkSetMacro(CopyCellData,
int);
00210 vtkGetMacro(CopyCellData,
int);
00211 vtkBooleanMacro(CopyCellData,
int);
00213
00214
protected:
00215 vtkQuadricClustering();
00216 ~vtkQuadricClustering();
00217
00218
void Execute();
00219
00221
vtkIdType HashPoint(
float point[3]);
00222
00224
00225
void ComputeRepresentativePoint(
float quadric[9],
vtkIdType binId,
00226
float point[3]);
00228
00230
00232
void AddPolygons(
vtkCellArray *polys,
vtkPoints *points,
int geometryFlag);
00233
void AddStrips(
vtkCellArray *strips,
vtkPoints *points,
int geometryFlag);
00234
void AddTriangle(
vtkIdType *binIds,
float *pt0,
float *pt1,
float *pt2,
00235
int geometeryFlag);
00237
00239
00241
void AddEdges(
vtkCellArray *edges,
vtkPoints *points,
00242
int geometryFlag);
00243
void AddEdge(
vtkIdType *binIds,
float *pt0,
float *pt1,
int geometeryFlag);
00245
00247
00249
void AddVertices(
vtkCellArray *verts,
vtkPoints *points,
int geometryFlag);
00250
void AddVertex(
vtkIdType binId,
float *pt,
int geometryFlag);
00252
00254
void InitializeQuadric(
float quadric[9]);
00255
00257
void AddQuadric(
vtkIdType binId,
float quadric[9]);
00258
00263
void FindFeaturePoints(
vtkCellArray *edges,
vtkPoints *edgePts,
float angle);
00264
00266
00268
void EndAppendUsingPoints(
vtkPolyData *input);
00269 int UseInputPoints;
00271
00274
void EndAppendVertexGeometry(
vtkPolyData *input);
00275
00276
00277
void AppendFeatureQuadrics(
vtkPolyData *pd);
00278 int UseFeatureEdges;
00279 int UseFeaturePoints;
00280 int UseInternalTriangles;
00281
00282 int NumberOfXDivisions;
00283 int NumberOfYDivisions;
00284 int NumberOfZDivisions;
00285
00286
00287
00288 int NumberOfDivisions[3];
00289
00290
00291
00292
00293 int ComputeNumberOfDivisions;
00294
00295 float DivisionOrigin[3];
00296 float DivisionSpacing[3];
00297 int AutoAdjustNumberOfDivisions;
00298
00299 float Bounds[6];
00300 float XBinSize;
00301 float YBinSize;
00302 float ZBinSize;
00303 vtkIdType SliceSize;
00304
00305
00306 struct PointQuadric
00307 {
00308 PointQuadric():VertexId(-1),Dimension(255) {}
00309
00310 vtkIdType VertexId;
00311
00312
00313
00314 unsigned char Dimension;
00315 float Quadric[9];
00316 };
00317
00318
00319 PointQuadric* QuadricArray;
00320 vtkIdType NumberOfBinsUsed;
00321
00322
00323
00324 vtkCellArray *OutputTriangleArray;
00325 vtkCellArray *OutputLines;
00326
00327 vtkFeatureEdges *FeatureEdges;
00328 vtkPoints *FeaturePoints;
00329 float FeaturePointsAngle;
00330
00331 int CopyCellData;
00332 int InCellCount;
00333 int OutCellCount;
00334
00335
private:
00336 vtkQuadricClustering(
const vtkQuadricClustering&);
00337
void operator=(
const vtkQuadricClustering&);
00338 };
00339
00340
#endif