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   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 =========================================================================*/
00096 #ifndef __vtkQuadricClustering_h
00097 #define __vtkQuadricClustering_h
00098 
00099 #include "vtkPolyDataToPolyDataFilter.h"
00100 
00101 class vtkCellArray;
00102 class vtkFeatureEdges;
00103 class vtkPoints;
00104 
00105 class VTK_GRAPHICS_EXPORT vtkQuadricClustering : public vtkPolyDataToPolyDataFilter
00106 {
00107 public:
00108   vtkTypeRevisionMacro(vtkQuadricClustering, vtkPolyDataToPolyDataFilter);
00109   void PrintSelf(ostream& os, vtkIndent indent);
00110   static vtkQuadricClustering *New();
00111 
00113 
00118   void SetNumberOfXDivisions(int num);
00119   void SetNumberOfYDivisions(int num);
00120   void SetNumberOfZDivisions(int num);
00121   vtkGetMacro(NumberOfXDivisions, int);
00122   vtkGetMacro(NumberOfYDivisions, int);
00123   vtkGetMacro(NumberOfZDivisions, int);
00124   void SetNumberOfDivisions(int div[3]);
00125   int *GetNumberOfDivisions();
00126   void GetNumberOfDivisions(int div[3]);
00128 
00130 
00133   vtkSetMacro(AutoAdjustNumberOfDivisions,int);
00134   vtkGetMacro(AutoAdjustNumberOfDivisions,int);
00135   vtkBooleanMacro(AutoAdjustNumberOfDivisions,int);
00137 
00139 
00143   void SetDivisionOrigin(float x, float y, float z);
00144   void SetDivisionOrigin(float o[3]) 
00145     {this->SetDivisionOrigin(o[0],o[1],o[2]);}
00146   vtkGetVector3Macro(DivisionOrigin, float);
00147   void SetDivisionSpacing(float x, float y, float z);
00148   void SetDivisionSpacing(float s[3]) 
00149     {this->SetDivisionSpacing(s[0],s[1],s[2]);}
00150   vtkGetVector3Macro(DivisionSpacing, float);
00152 
00154 
00160   vtkSetMacro(UseInputPoints, int);
00161   vtkGetMacro(UseInputPoints, int);
00162   vtkBooleanMacro(UseInputPoints, int);
00164 
00166 
00170   vtkSetMacro(UseFeatureEdges, int);
00171   vtkGetMacro(UseFeatureEdges, int);
00172   vtkBooleanMacro(UseFeatureEdges, int);
00173   vtkFeatureEdges *GetFeatureEdges() {return this->FeatureEdges;}
00175 
00177 
00182   vtkSetMacro(UseFeaturePoints, int);
00183   vtkGetMacro(UseFeaturePoints, int);
00184   vtkBooleanMacro(UseFeaturePoints, int);
00186 
00188 
00190   vtkSetClampMacro(FeaturePointsAngle, float, 0.0, 180.0);
00191   vtkGetMacro(FeaturePointsAngle, float);
00193   
00195 
00199   vtkSetMacro(UseInternalTriangles, int);
00200   vtkGetMacro(UseInternalTriangles, int);
00201   vtkBooleanMacro(UseInternalTriangles, int);
00203 
00205 
00209   void StartAppend(float *bounds);
00210   void StartAppend(float x0,float x1,float y0,float y1,float z0,float z1)
00211     {float b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1; 
00212     this->StartAppend(b);}  
00213   void Append(vtkPolyData *piece);
00214   void EndAppend();
00216 
00218 
00222   vtkSetMacro(CopyCellData, int); 
00223   vtkGetMacro(CopyCellData, int); 
00224   vtkBooleanMacro(CopyCellData, int); 
00226 
00227 protected:
00228   vtkQuadricClustering();
00229   ~vtkQuadricClustering();
00230 
00231   void Execute();
00232     
00234   vtkIdType HashPoint(float point[3]);
00235   
00237 
00238   void ComputeRepresentativePoint(float quadric[9], vtkIdType binId,
00239                                   float point[3]);
00241 
00243 
00245   void AddPolygons(vtkCellArray *polys, vtkPoints *points, int geometryFlag);
00246   void AddStrips(vtkCellArray *strips, vtkPoints *points, int geometryFlag);
00247   void AddTriangle(vtkIdType *binIds, float *pt0, float *pt1, float *pt2,
00248                    int geometeryFlag);
00250 
00252 
00254   void AddEdges(vtkCellArray *edges, vtkPoints *points,
00255                 int geometryFlag);
00256   void AddEdge(vtkIdType *binIds, float *pt0, float *pt1, int geometeryFlag);
00258 
00260 
00262   void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag);
00263   void AddVertex(vtkIdType binId, float *pt, int geometryFlag);
00265 
00267   void InitializeQuadric(float quadric[9]);
00268   
00270   void AddQuadric(vtkIdType binId, float quadric[9]);
00271 
00276   void FindFeaturePoints(vtkCellArray *edges, vtkPoints *edgePts, float angle);
00277   
00279 
00281   void EndAppendUsingPoints(vtkPolyData *input);
00282   int UseInputPoints;
00284 
00287   void EndAppendVertexGeometry(vtkPolyData *input);
00288 
00289   // Unfinished option to handle boundary edges differently.
00290   void AppendFeatureQuadrics(vtkPolyData *pd);
00291   int UseFeatureEdges;
00292   int UseFeaturePoints;
00293   int UseInternalTriangles;
00294 
00295   int NumberOfXDivisions;
00296   int NumberOfYDivisions;
00297   int NumberOfZDivisions;
00298 
00299   // Used internally.
00300   // can be smaller than user values when input numb er of points is small.
00301   int NumberOfDivisions[3];
00302 
00303   // Since there are two was of specifing the grid, we have this flag
00304   // to indicate which the user has set.  When this flag is on, 
00305   // the bin sizes are computed from the DivisionOrigin and DivisionSpacing. 
00306   int ComputeNumberOfDivisions;
00307 
00308   float DivisionOrigin[3];
00309   float DivisionSpacing[3];
00310   int   AutoAdjustNumberOfDivisions;
00311 
00312   float Bounds[6];
00313   float XBinSize;
00314   float YBinSize;
00315   float ZBinSize;
00316   vtkIdType SliceSize; //eliminate one multiplication
00317 
00318   //BTX
00319   struct PointQuadric 
00320   {
00321     PointQuadric():VertexId(-1),Dimension(255) {}
00322     
00323     vtkIdType VertexId;
00324     // Dimension is supposed to be a flag representing the dimension of the
00325     // cells contributing to the quadric.  Lines: 1, Triangles: 2 (and points
00326     // 0 in the future?)
00327     unsigned char Dimension;
00328     float Quadric[9];
00329   };
00330   //ETX
00331 
00332   PointQuadric* QuadricArray;
00333   vtkIdType NumberOfBinsUsed;
00334 
00335   // Have to make these instance variables if we are going to allow
00336   // the algorithm to be driven by the Append methods.
00337   vtkCellArray *OutputTriangleArray;
00338   vtkCellArray *OutputLines;
00339 
00340   vtkFeatureEdges *FeatureEdges;
00341   vtkPoints *FeaturePoints;
00342   float FeaturePointsAngle;
00343 
00344   int CopyCellData;
00345   int InCellCount;
00346   int OutCellCount;
00347 
00348 private:
00349   vtkQuadricClustering(const vtkQuadricClustering&);  // Not implemented.
00350   void operator=(const vtkQuadricClustering&);  // Not implemented.
00351 };
00352 
00353 #endif