00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00084 #ifndef __vtkQuadricClustering_h
00085 #define __vtkQuadricClustering_h
00086
00087 #include "vtkPolyDataToPolyDataFilter.h"
00088
00089 class vtkCellArray;
00090 class vtkFeatureEdges;
00091 class vtkPoints;
00092
00093 class VTK_GRAPHICS_EXPORT vtkQuadricClustering : public vtkPolyDataToPolyDataFilter
00094 {
00095 public:
00096 vtkTypeRevisionMacro(vtkQuadricClustering, vtkPolyDataToPolyDataFilter);
00097 void PrintSelf(ostream& os, vtkIndent indent);
00098 static vtkQuadricClustering *New();
00099
00101
00105 vtkSetMacro(UseFeatureEdges, int);
00106 vtkGetMacro(UseFeatureEdges, int);
00107 vtkBooleanMacro(UseFeatureEdges, int);
00108 vtkFeatureEdges *GetFeatureEdges() {return this->FeatureEdges;}
00110
00112
00117 vtkSetMacro(UseFeaturePoints, int);
00118 vtkGetMacro(UseFeaturePoints, int);
00119 vtkBooleanMacro(UseFeaturePoints, int);
00121
00123
00125 vtkSetClampMacro(FeaturePointsAngle, float, 0.0, 180.0);
00126 vtkGetMacro(FeaturePointsAngle, float);
00128
00130
00134 void SetNumberOfXDivisions(int num);
00135 void SetNumberOfYDivisions(int num);
00136 void SetNumberOfZDivisions(int num);
00137 vtkGetMacro(NumberOfXDivisions, int);
00138 vtkGetMacro(NumberOfYDivisions, int);
00139 vtkGetMacro(NumberOfZDivisions, int);
00140 void SetNumberOfDivisions(int div[3]);
00141 int *GetNumberOfDivisions();
00142 void GetNumberOfDivisions(int div[3]);
00144
00146
00149 void SetDivisionOrigin(float x, float y, float z);
00150 void SetDivisionOrigin(float o[3]) {this->SetDivisionOrigin(o[0],o[1],o[2]);}
00151 vtkGetVector3Macro(DivisionOrigin, float);
00152 void SetDivisionSpacing(float x, float y, float z);
00153 void SetDivisionSpacing(float s[3]) {this->SetDivisionSpacing(s[0],s[1],s[2]);}
00154 vtkGetVector3Macro(DivisionSpacing, float);
00156
00158
00162 vtkSetMacro(UseInternalTriangles, int);
00163 vtkGetMacro(UseInternalTriangles, int);
00164 vtkBooleanMacro(UseInternalTriangles, int);
00166
00168
00173 vtkSetMacro(UseInputPoints, int);
00174 vtkGetMacro(UseInputPoints, int);
00175 vtkBooleanMacro(UseInputPoints, int);
00177
00179
00183 void StartAppend(float *bounds);
00184 void StartAppend(float x0,float x1,float y0,float y1,float z0,float z1)
00185 {float b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1;
00186 this->StartAppend(b);}
00187 void Append(vtkPolyData *piece);
00188 void EndAppend();
00190
00192
00196 vtkSetMacro(CopyCellData, int);
00197 vtkGetMacro(CopyCellData, int);
00198 vtkBooleanMacro(CopyCellData, int);
00200
00203 protected:
00204 vtkQuadricClustering();
00205 ~vtkQuadricClustering();
00206
00207 void Execute();
00208
00210 vtkIdType HashPoint(float point[3]);
00211
00213
00214 void ComputeRepresentativePoint(float quadric[9], vtkIdType binId,
00215 float point[3]);
00217
00219
00221 void AddTriangles(vtkCellArray *tris, vtkPoints *points,
00222 int geometryFlag);
00223 void AddPolygons(vtkCellArray *polys, vtkPoints *points,
00224 int geometryFlag);
00225 void AddTriangle(vtkIdType *binIds, float *pt0, float *pt1, float *pt2,
00226 int geometeryFlag);
00228
00230
00232 void AddEdges(vtkCellArray *edges, vtkPoints *points,
00233 int geometryFlag);
00234 void AddEdge(vtkIdType *binIds, float *pt0, float *pt1, int geometeryFlag);
00236
00238
00240 void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag);
00241 void AddVertex(vtkIdType binId, float *pt, int geometryFlag);
00243
00245 void InitializeQuadric(float quadric[9]);
00246
00248 void AddQuadric(vtkIdType binId, float quadric[9]);
00249
00254 void FindFeaturePoints(vtkCellArray *edges, vtkPoints *edgePts, float angle);
00255
00257
00259 void EndAppendUsingPoints(vtkPolyData *input);
00260 int UseInputPoints;
00262
00265 void EndAppendVertexGeometry(vtkPolyData *input);
00266
00267
00268 void AppendFeatureQuadrics(vtkPolyData *pd);
00269 int UseFeatureEdges;
00270 int UseFeaturePoints;
00271 int UseInternalTriangles;
00272
00273 int NumberOfXDivisions;
00274 int NumberOfYDivisions;
00275 int NumberOfZDivisions;
00276
00277
00278
00279 int NumberOfDivisions[3];
00280
00281
00282
00283
00284 int ComputeNumberOfDivisions;
00285
00286 float DivisionOrigin[3];
00287 float DivisionSpacing[3];
00288
00289 float Bounds[6];
00290 float XBinSize;
00291 float YBinSize;
00292 float ZBinSize;
00293
00294
00295 class PointQuadric
00296 {
00297 public:
00298 vtkIdType VertexId;
00299
00300
00301
00302 unsigned char Dimension;
00303 float Quadric[9];
00304 };
00305
00306 PointQuadric* QuadricArray;
00307
00308 vtkIdType NumberOfBinsUsed;
00309
00310
00311
00312 vtkCellArray *OutputTriangleArray;
00313 vtkCellArray *OutputLines;
00314
00315 vtkFeatureEdges *FeatureEdges;
00316 vtkPoints *FeaturePoints;
00317 float FeaturePointsAngle;
00318
00319 int CopyCellData;
00320 int InCellCount;
00321 int OutCellCount;
00322 private:
00323 vtkQuadricClustering(const vtkQuadricClustering&);
00324 void operator=(const vtkQuadricClustering&);
00325 };
00326
00327 #endif