Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

dox/Graphics/vtkQuadricClustering.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkQuadricClustering.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2002 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00010 00011 This software is distributed WITHOUT ANY WARRANTY; without even 00012 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 PURPOSE. See the above copyright notice for more information. 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 // Unfinished option to handle boundary edges differently. 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 // Used internally. 00287 // can be smaller than user values when input numb er of points is small. 00288 int NumberOfDivisions[3]; 00289 00290 // Since there are two was of specifing the grid, we have this flag 00291 // to indicate which the user has set. When this flag is on, 00292 // the bin sizes are computed from the DivisionOrigin and DivisionSpacing. 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; //eliminate one multiplication 00304 00305 //BTX 00306 struct PointQuadric 00307 { 00308 PointQuadric():VertexId(-1),Dimension(255) {} 00309 00310 vtkIdType VertexId; 00311 // Dimension is supposed to be a flag representing the dimension of the 00312 // cells contributing to the quadric. Lines: 1, Triangles: 2 (and points 00313 // 0 in the future?) 00314 unsigned char Dimension; 00315 float Quadric[9]; 00316 }; 00317 //ETX 00318 00319 PointQuadric* QuadricArray; 00320 vtkIdType NumberOfBinsUsed; 00321 00322 // Have to make these instance variables if we are going to allow 00323 // the algorithm to be driven by the Append methods. 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&); // Not implemented. 00337 void operator=(const vtkQuadricClustering&); // Not implemented. 00338 }; 00339 00340 #endif