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