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