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

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