00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00087 #ifndef __vtkQuadricClustering_h
00088 #define __vtkQuadricClustering_h
00089
00090 #include "vtkPolyDataAlgorithm.h"
00091
00092 class vtkCellArray;
00093 class vtkFeatureEdges;
00094 class vtkPoints;
00095 class vtkQuadricClusteringCellSet;
00096
00097
00098 class VTK_GRAPHICS_EXPORT vtkQuadricClustering : public vtkPolyDataAlgorithm
00099 {
00100 public:
00102
00103 vtkTypeMacro(vtkQuadricClustering, vtkPolyDataAlgorithm);
00104 void PrintSelf(ostream& os, vtkIndent indent);
00105 static vtkQuadricClustering *New();
00107
00109
00114 void SetNumberOfXDivisions(int num);
00115 void SetNumberOfYDivisions(int num);
00116 void SetNumberOfZDivisions(int num);
00117 vtkGetMacro(NumberOfXDivisions, int);
00118 vtkGetMacro(NumberOfYDivisions, int);
00119 vtkGetMacro(NumberOfZDivisions, int);
00120 void SetNumberOfDivisions(int div[3])
00121 { this->SetNumberOfDivisions(div[0], div[1], div[2]); }
00122 void SetNumberOfDivisions(int div0, int div1, int div2);
00123 int *GetNumberOfDivisions();
00124 void GetNumberOfDivisions(int div[3]);
00126
00128
00131 vtkSetMacro(AutoAdjustNumberOfDivisions,int);
00132 vtkGetMacro(AutoAdjustNumberOfDivisions,int);
00133 vtkBooleanMacro(AutoAdjustNumberOfDivisions,int);
00135
00137
00141 void SetDivisionOrigin(double x, double y, double z);
00142 void SetDivisionOrigin(double o[3])
00143 {this->SetDivisionOrigin(o[0],o[1],o[2]);}
00144 vtkGetVector3Macro(DivisionOrigin, double);
00145 void SetDivisionSpacing(double x, double y, double z);
00146 void SetDivisionSpacing(double s[3])
00147 {this->SetDivisionSpacing(s[0],s[1],s[2]);}
00148 vtkGetVector3Macro(DivisionSpacing, double);
00150
00152
00158 vtkSetMacro(UseInputPoints, int);
00159 vtkGetMacro(UseInputPoints, int);
00160 vtkBooleanMacro(UseInputPoints, int);
00162
00164
00168 vtkSetMacro(UseFeatureEdges, int);
00169 vtkGetMacro(UseFeatureEdges, int);
00170 vtkBooleanMacro(UseFeatureEdges, int);
00171 vtkFeatureEdges *GetFeatureEdges() {return this->FeatureEdges;}
00173
00175
00180 vtkSetMacro(UseFeaturePoints, int);
00181 vtkGetMacro(UseFeaturePoints, int);
00182 vtkBooleanMacro(UseFeaturePoints, int);
00184
00186
00188 vtkSetClampMacro(FeaturePointsAngle, double, 0.0, 180.0);
00189 vtkGetMacro(FeaturePointsAngle, double);
00191
00193
00197 vtkSetMacro(UseInternalTriangles, int);
00198 vtkGetMacro(UseInternalTriangles, int);
00199 vtkBooleanMacro(UseInternalTriangles, int);
00201
00203
00207 void StartAppend(double *bounds);
00208 void StartAppend(double x0,double x1,double y0,double y1,double z0,double z1)
00209 {double b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1;
00210 this->StartAppend(b);}
00211 void Append(vtkPolyData *piece);
00212 void EndAppend();
00214
00216
00220 vtkSetMacro(CopyCellData, int);
00221 vtkGetMacro(CopyCellData, int);
00222 vtkBooleanMacro(CopyCellData, int);
00224
00226
00230 vtkSetMacro(PreventDuplicateCells,int);
00231 vtkGetMacro(PreventDuplicateCells,int);
00232 vtkBooleanMacro(PreventDuplicateCells,int);
00234
00235 protected:
00236 vtkQuadricClustering();
00237 ~vtkQuadricClustering();
00238
00239 int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00240 int FillInputPortInformation(int, vtkInformation *);
00241
00243 vtkIdType HashPoint(double point[3]);
00244
00246
00247 void ComputeRepresentativePoint(double quadric[9], vtkIdType binId,
00248 double point[3]);
00250
00252
00254 void AddPolygons(vtkCellArray *polys, vtkPoints *points, int geometryFlag,
00255 vtkPolyData *input, vtkPolyData *output);
00256 void AddStrips(vtkCellArray *strips, vtkPoints *points, int geometryFlag,
00257 vtkPolyData *input, vtkPolyData *output);
00258 void AddTriangle(vtkIdType *binIds, double *pt0, double *pt1, double *pt2,
00259 int geometeryFlag, vtkPolyData *input, vtkPolyData *output);
00261
00263
00265 void AddEdges(vtkCellArray *edges, vtkPoints *points,
00266 int geometryFlag,
00267 vtkPolyData *input, vtkPolyData *output);
00268 void AddEdge(vtkIdType *binIds, double *pt0, double *pt1, int geometeryFlag,
00269 vtkPolyData *input, vtkPolyData *output);
00271
00273
00275 void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag,
00276 vtkPolyData *input, vtkPolyData *output);
00277 void AddVertex(vtkIdType binId, double *pt, int geometryFlag,
00278 vtkPolyData *input, vtkPolyData *output);
00280
00282 void InitializeQuadric(double quadric[9]);
00283
00285 void AddQuadric(vtkIdType binId, double quadric[9]);
00286
00291 void FindFeaturePoints(vtkCellArray *edges, vtkPoints *edgePts, double angle);
00292
00294
00296 void EndAppendUsingPoints(vtkPolyData *input, vtkPolyData *output);
00297 int UseInputPoints;
00299
00302 void EndAppendVertexGeometry(vtkPolyData *input, vtkPolyData *output);
00303
00304
00305 void AppendFeatureQuadrics(vtkPolyData *pd, vtkPolyData *output);
00306 int UseFeatureEdges;
00307 int UseFeaturePoints;
00308 int UseInternalTriangles;
00309
00310 int NumberOfXDivisions;
00311 int NumberOfYDivisions;
00312 int NumberOfZDivisions;
00313
00314
00315 int PreventDuplicateCells;
00316 vtkQuadricClusteringCellSet *CellSet;
00317 vtkIdType NumberOfBins;
00318
00319
00320
00321 int NumberOfDivisions[3];
00322
00323
00324
00325
00326 int ComputeNumberOfDivisions;
00327
00328 double DivisionOrigin[3];
00329 double DivisionSpacing[3];
00330 int AutoAdjustNumberOfDivisions;
00331
00332 double Bounds[6];
00333 double XBinSize;
00334 double YBinSize;
00335 double ZBinSize;
00336 double XBinStep;
00337 double YBinStep;
00338 double ZBinStep;
00339 vtkIdType SliceSize;
00340
00341
00342 struct PointQuadric
00343 {
00344 PointQuadric():VertexId(-1),Dimension(255) {}
00345
00346 vtkIdType VertexId;
00347
00348
00349
00350 unsigned char Dimension;
00351 double Quadric[9];
00352 };
00353
00354
00355 PointQuadric* QuadricArray;
00356 vtkIdType NumberOfBinsUsed;
00357
00358
00359
00360 vtkCellArray *OutputTriangleArray;
00361 vtkCellArray *OutputLines;
00362
00363 vtkFeatureEdges *FeatureEdges;
00364 vtkPoints *FeaturePoints;
00365 double FeaturePointsAngle;
00366
00367 int CopyCellData;
00368 int InCellCount;
00369 int OutCellCount;
00370
00371 private:
00372 vtkQuadricClustering(const vtkQuadricClustering&);
00373 void operator=(const vtkQuadricClustering&);
00374 };
00375
00376 #endif