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