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