00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00096 #ifndef __vtkQuadricClustering_h
00097 #define __vtkQuadricClustering_h
00098
00099 #include "vtkPolyDataToPolyDataFilter.h"
00100
00101 class vtkCellArray;
00102 class vtkFeatureEdges;
00103 class vtkPoints;
00104
00105 class VTK_GRAPHICS_EXPORT vtkQuadricClustering : public vtkPolyDataToPolyDataFilter
00106 {
00107 public:
00108 vtkTypeRevisionMacro(vtkQuadricClustering, vtkPolyDataToPolyDataFilter);
00109 void PrintSelf(ostream& os, vtkIndent indent);
00110 static vtkQuadricClustering *New();
00111
00113
00118 void SetNumberOfXDivisions(int num);
00119 void SetNumberOfYDivisions(int num);
00120 void SetNumberOfZDivisions(int num);
00121 vtkGetMacro(NumberOfXDivisions, int);
00122 vtkGetMacro(NumberOfYDivisions, int);
00123 vtkGetMacro(NumberOfZDivisions, int);
00124 void SetNumberOfDivisions(int div[3]);
00125 int *GetNumberOfDivisions();
00126 void GetNumberOfDivisions(int div[3]);
00128
00130
00133 vtkSetMacro(AutoAdjustNumberOfDivisions,int);
00134 vtkGetMacro(AutoAdjustNumberOfDivisions,int);
00135 vtkBooleanMacro(AutoAdjustNumberOfDivisions,int);
00137
00139
00143 void SetDivisionOrigin(float x, float y, float z);
00144 void SetDivisionOrigin(float o[3])
00145 {this->SetDivisionOrigin(o[0],o[1],o[2]);}
00146 vtkGetVector3Macro(DivisionOrigin, float);
00147 void SetDivisionSpacing(float x, float y, float z);
00148 void SetDivisionSpacing(float s[3])
00149 {this->SetDivisionSpacing(s[0],s[1],s[2]);}
00150 vtkGetVector3Macro(DivisionSpacing, float);
00152
00154
00160 vtkSetMacro(UseInputPoints, int);
00161 vtkGetMacro(UseInputPoints, int);
00162 vtkBooleanMacro(UseInputPoints, int);
00164
00166
00170 vtkSetMacro(UseFeatureEdges, int);
00171 vtkGetMacro(UseFeatureEdges, int);
00172 vtkBooleanMacro(UseFeatureEdges, int);
00173 vtkFeatureEdges *GetFeatureEdges() {return this->FeatureEdges;}
00175
00177
00182 vtkSetMacro(UseFeaturePoints, int);
00183 vtkGetMacro(UseFeaturePoints, int);
00184 vtkBooleanMacro(UseFeaturePoints, int);
00186
00188
00190 vtkSetClampMacro(FeaturePointsAngle, float, 0.0, 180.0);
00191 vtkGetMacro(FeaturePointsAngle, float);
00193
00195
00199 vtkSetMacro(UseInternalTriangles, int);
00200 vtkGetMacro(UseInternalTriangles, int);
00201 vtkBooleanMacro(UseInternalTriangles, int);
00203
00205
00209 void StartAppend(float *bounds);
00210 void StartAppend(float x0,float x1,float y0,float y1,float z0,float z1)
00211 {float b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1;
00212 this->StartAppend(b);}
00213 void Append(vtkPolyData *piece);
00214 void EndAppend();
00216
00218
00222 vtkSetMacro(CopyCellData, int);
00223 vtkGetMacro(CopyCellData, int);
00224 vtkBooleanMacro(CopyCellData, int);
00226
00227 protected:
00228 vtkQuadricClustering();
00229 ~vtkQuadricClustering();
00230
00231 void Execute();
00232
00234 vtkIdType HashPoint(float point[3]);
00235
00237
00238 void ComputeRepresentativePoint(float quadric[9], vtkIdType binId,
00239 float point[3]);
00241
00243
00245 void AddPolygons(vtkCellArray *polys, vtkPoints *points, int geometryFlag);
00246 void AddStrips(vtkCellArray *strips, vtkPoints *points, int geometryFlag);
00247 void AddTriangle(vtkIdType *binIds, float *pt0, float *pt1, float *pt2,
00248 int geometeryFlag);
00250
00252
00254 void AddEdges(vtkCellArray *edges, vtkPoints *points,
00255 int geometryFlag);
00256 void AddEdge(vtkIdType *binIds, float *pt0, float *pt1, int geometeryFlag);
00258
00260
00262 void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag);
00263 void AddVertex(vtkIdType binId, float *pt, int geometryFlag);
00265
00267 void InitializeQuadric(float quadric[9]);
00268
00270 void AddQuadric(vtkIdType binId, float quadric[9]);
00271
00276 void FindFeaturePoints(vtkCellArray *edges, vtkPoints *edgePts, float angle);
00277
00279
00281 void EndAppendUsingPoints(vtkPolyData *input);
00282 int UseInputPoints;
00284
00287 void EndAppendVertexGeometry(vtkPolyData *input);
00288
00289
00290 void AppendFeatureQuadrics(vtkPolyData *pd);
00291 int UseFeatureEdges;
00292 int UseFeaturePoints;
00293 int UseInternalTriangles;
00294
00295 int NumberOfXDivisions;
00296 int NumberOfYDivisions;
00297 int NumberOfZDivisions;
00298
00299
00300
00301 int NumberOfDivisions[3];
00302
00303
00304
00305
00306 int ComputeNumberOfDivisions;
00307
00308 float DivisionOrigin[3];
00309 float DivisionSpacing[3];
00310 int AutoAdjustNumberOfDivisions;
00311
00312 float Bounds[6];
00313 float XBinSize;
00314 float YBinSize;
00315 float ZBinSize;
00316 vtkIdType SliceSize;
00317
00318
00319 struct PointQuadric
00320 {
00321 PointQuadric():VertexId(-1),Dimension(255) {}
00322
00323 vtkIdType VertexId;
00324
00325
00326
00327 unsigned char Dimension;
00328 float Quadric[9];
00329 };
00330
00331
00332 PointQuadric* QuadricArray;
00333 vtkIdType NumberOfBinsUsed;
00334
00335
00336
00337 vtkCellArray *OutputTriangleArray;
00338 vtkCellArray *OutputLines;
00339
00340 vtkFeatureEdges *FeatureEdges;
00341 vtkPoints *FeaturePoints;
00342 float FeaturePointsAngle;
00343
00344 int CopyCellData;
00345 int InCellCount;
00346 int OutCellCount;
00347
00348 private:
00349 vtkQuadricClustering(const vtkQuadricClustering&);
00350 void operator=(const vtkQuadricClustering&);
00351 };
00352
00353 #endif