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