VTK
vtkQuadricClustering.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkQuadricClustering.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
87 #ifndef vtkQuadricClustering_h
88 #define vtkQuadricClustering_h
89 
90 #include "vtkFiltersCoreModule.h" // For export macro
91 #include "vtkPolyDataAlgorithm.h"
92 
93 class vtkCellArray;
94 class vtkFeatureEdges;
95 class vtkPoints;
96 class vtkQuadricClusteringCellSet;
97 
98 
100 {
101 public:
103 
105  void PrintSelf(ostream& os, vtkIndent indent);
108 
110 
118  vtkGetMacro(NumberOfXDivisions, int);
119  vtkGetMacro(NumberOfYDivisions, int);
120  vtkGetMacro(NumberOfZDivisions, int);
121  void SetNumberOfDivisions(int div[3])
122  { this->SetNumberOfDivisions(div[0], div[1], div[2]); }
123  void SetNumberOfDivisions(int div0, int div1, int div2);
125  void GetNumberOfDivisions(int div[3]);
127 
129 
132  vtkSetMacro(AutoAdjustNumberOfDivisions,int);
133  vtkGetMacro(AutoAdjustNumberOfDivisions,int);
134  vtkBooleanMacro(AutoAdjustNumberOfDivisions,int);
136 
138 
142  void SetDivisionOrigin(double x, double y, double z);
143  void SetDivisionOrigin(double o[3])
144  {this->SetDivisionOrigin(o[0],o[1],o[2]);}
145  vtkGetVector3Macro(DivisionOrigin, double);
146  void SetDivisionSpacing(double x, double y, double z);
147  void SetDivisionSpacing(double s[3])
148  {this->SetDivisionSpacing(s[0],s[1],s[2]);}
149  vtkGetVector3Macro(DivisionSpacing, double);
151 
153 
159  vtkSetMacro(UseInputPoints, int);
160  vtkGetMacro(UseInputPoints, int);
161  vtkBooleanMacro(UseInputPoints, int);
163 
165 
169  vtkSetMacro(UseFeatureEdges, int);
170  vtkGetMacro(UseFeatureEdges, int);
171  vtkBooleanMacro(UseFeatureEdges, int);
172  vtkFeatureEdges *GetFeatureEdges() {return this->FeatureEdges;}
174 
176 
181  vtkSetMacro(UseFeaturePoints, int);
182  vtkGetMacro(UseFeaturePoints, int);
183  vtkBooleanMacro(UseFeaturePoints, int);
185 
187 
189  vtkSetClampMacro(FeaturePointsAngle, double, 0.0, 180.0);
190  vtkGetMacro(FeaturePointsAngle, double);
192 
194 
198  vtkSetMacro(UseInternalTriangles, int);
199  vtkGetMacro(UseInternalTriangles, int);
200  vtkBooleanMacro(UseInternalTriangles, int);
202 
204 
208  void StartAppend(double *bounds);
209  void StartAppend(double x0,double x1,double y0,double y1,double z0,double z1)
210  {double b[6]; b[0]=x0; b[1]=x1; b[2]=y0; b[3]=y1; b[4]=z0; b[5]=z1;
211  this->StartAppend(b);}
212  void Append(vtkPolyData *piece);
213  void EndAppend();
215 
217 
221  vtkSetMacro(CopyCellData, int);
222  vtkGetMacro(CopyCellData, int);
223  vtkBooleanMacro(CopyCellData, int);
225 
227 
231  vtkSetMacro(PreventDuplicateCells,int);
232  vtkGetMacro(PreventDuplicateCells,int);
233  vtkBooleanMacro(PreventDuplicateCells,int);
235 
236 protected:
239 
242 
245 
247 
248  void ComputeRepresentativePoint(double quadric[9], vtkIdType binId,
249  double point[3]);
251 
253 
255  void AddPolygons(vtkCellArray *polys, vtkPoints *points, int geometryFlag,
256  vtkPolyData *input, vtkPolyData *output);
257  void AddStrips(vtkCellArray *strips, vtkPoints *points, int geometryFlag,
258  vtkPolyData *input, vtkPolyData *output);
259  void AddTriangle(vtkIdType *binIds, double *pt0, double *pt1, double *pt2,
260  int geometeryFlag, vtkPolyData *input, vtkPolyData *output);
262 
264 
267  int geometryFlag,
268  vtkPolyData *input, vtkPolyData *output);
269  void AddEdge(vtkIdType *binIds, double *pt0, double *pt1, int geometeryFlag,
270  vtkPolyData *input, vtkPolyData *output);
272 
274 
276  void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag,
277  vtkPolyData *input, vtkPolyData *output);
278  void AddVertex(vtkIdType binId, double *pt, int geometryFlag,
279  vtkPolyData *input, vtkPolyData *output);
281 
283  void InitializeQuadric(double quadric[9]);
284 
286  void AddQuadric(vtkIdType binId, double quadric[9]);
287 
293 
295 
300 
304 
305  // Unfinished option to handle boundary edges differently.
310 
314 
315  // Set this to eliminate duplicate cells
317  vtkQuadricClusteringCellSet *CellSet; //PIMPLd stl set for tracking inserted cells
319 
320  // Used internally.
321  // can be smaller than user values when input numb er of points is small.
322  int NumberOfDivisions[3];
323 
324  // Since there are two was of specifing the grid, we have this flag
325  // to indicate which the user has set. When this flag is on,
326  // the bin sizes are computed from the DivisionOrigin and DivisionSpacing.
328 
329  double DivisionOrigin[3];
330  double DivisionSpacing[3];
332 
333  double Bounds[6];
334  double XBinSize;
335  double YBinSize;
336  double ZBinSize;
337  double XBinStep; //replace some divisions with multiplication
338  double YBinStep;
339  double ZBinStep;
340  vtkIdType SliceSize; //eliminate one multiplication
341 
342  //BTX
344  {
345  PointQuadric():VertexId(-1),Dimension(255) {}
346 
348  // Dimension is supposed to be a flag representing the dimension of the
349  // cells contributing to the quadric. Lines: 1, Triangles: 2 (and points
350  // 0 in the future?)
351  unsigned char Dimension;
352  double Quadric[9];
353  };
354  //ETX
355 
358 
359  // Have to make these instance variables if we are going to allow
360  // the algorithm to be driven by the Append methods.
363 
367 
371 
372 private:
373  vtkQuadricClustering(const vtkQuadricClustering&); // Not implemented.
374  void operator=(const vtkQuadricClustering&); // Not implemented.
375 };
376 
377 #endif
vtkPoints
represent and manipulate 3D points
Definition: vtkPoints.h:39
vtkgl::z
GLdouble GLdouble z
Definition: vtkgl.h:11754
vtkQuadricClustering::QuadricArray
PointQuadric * QuadricArray
Definition: vtkQuadricClustering.h:356
vtkQuadricClustering::AddEdges
void AddEdges(vtkCellArray *edges, vtkPoints *points, int geometryFlag, vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::SetDivisionSpacing
void SetDivisionSpacing(double x, double y, double z)
vtkgl::b
GLboolean GLboolean GLboolean b
Definition: vtkgl.h:12312
vtkQuadricClustering::~vtkQuadricClustering
~vtkQuadricClustering()
vtkQuadricClustering::SetNumberOfXDivisions
void SetNumberOfXDivisions(int num)
vtkQuadricClustering::NumberOfZDivisions
int NumberOfZDivisions
Definition: vtkQuadricClustering.h:313
vtkQuadricClustering::ComputeRepresentativePoint
void ComputeRepresentativePoint(double quadric[9], vtkIdType binId, double point[3])
vtkIdType
int vtkIdType
Definition: vtkType.h:275
vtkQuadricClustering::ZBinSize
double ZBinSize
Definition: vtkQuadricClustering.h:336
vtkInformationVector
Store zero or more vtkInformation instances.
Definition: vtkInformationVector.h:41
vtkQuadricClustering::OutCellCount
int OutCellCount
Definition: vtkQuadricClustering.h:370
vtkQuadricClustering::NumberOfYDivisions
int NumberOfYDivisions
Definition: vtkQuadricClustering.h:312
vtkgl::s
GLdouble s
Definition: vtkgl.h:11594
vtkQuadricClustering::EndAppendUsingPoints
void EndAppendUsingPoints(vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::InitializeQuadric
void InitializeQuadric(double quadric[9])
vtkTypeMacro
#define vtkTypeMacro(thisClass, superclass)
Definition: vtkSetGet.h:642
vtkQuadricClustering::AddStrips
void AddStrips(vtkCellArray *strips, vtkPoints *points, int geometryFlag, vtkPolyData *input, vtkPolyData *output)
vtkgl::x
GLint GLint GLint GLint GLint x
Definition: vtkgl.h:11318
vtkQuadricClustering::FeatureEdges
vtkFeatureEdges * FeatureEdges
Definition: vtkQuadricClustering.h:364
vtkQuadricClustering::UseInputPoints
int UseInputPoints
Definition: vtkQuadricClustering.h:298
vtkgl::input
GLenum GLenum GLenum input
Definition: vtkgl.h:15941
vtkQuadricClustering::OutputTriangleArray
vtkCellArray * OutputTriangleArray
Definition: vtkQuadricClustering.h:361
vtkQuadricClustering::CopyCellData
int CopyCellData
Definition: vtkQuadricClustering.h:368
vtkQuadricClustering::GetNumberOfDivisions
void GetNumberOfDivisions(int div[3])
vtkgl::points
GLsizei const GLfloat * points
Definition: vtkgl.h:14786
vtkQuadricClustering::AddTriangle
void AddTriangle(vtkIdType *binIds, double *pt0, double *pt1, double *pt2, int geometeryFlag, vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::AddQuadric
void AddQuadric(vtkIdType binId, double quadric[9])
vtkQuadricClustering::AutoAdjustNumberOfDivisions
int AutoAdjustNumberOfDivisions
Definition: vtkQuadricClustering.h:331
vtkQuadricClustering::PointQuadric::VertexId
vtkIdType VertexId
Definition: vtkQuadricClustering.h:347
vtkFiltersCoreModule.h
vtkQuadricClustering::New
static vtkQuadricClustering * New()
vtkQuadricClustering::SetNumberOfDivisions
void SetNumberOfDivisions(int div0, int div1, int div2)
vtkPolyDataAlgorithm.h
vtkQuadricClustering::PointQuadric::PointQuadric
PointQuadric()
Definition: vtkQuadricClustering.h:345
vtkQuadricClustering::AddVertices
void AddVertices(vtkCellArray *verts, vtkPoints *points, int geometryFlag, vtkPolyData *input, vtkPolyData *output)
edges
vtksys_stl::pair< boost::graph_traits< vtkGraph * >::edge_iterator, boost::graph_traits< vtkGraph * >::edge_iterator > edges(vtkGraph *g)
Definition: vtkBoostGraphAdapter.h:855
vtkQuadricClustering::SetNumberOfDivisions
void SetNumberOfDivisions(int div[3])
Definition: vtkQuadricClustering.h:121
vtkSetClampMacro
#define vtkSetClampMacro(name, type, min, max)
Definition: vtkSetGet.h:143
vtkQuadricClustering::SetNumberOfYDivisions
void SetNumberOfYDivisions(int num)
vtkX3D::point
@ point
Definition: vtkX3D.h:236
vtkQuadricClustering::EndAppendVertexGeometry
void EndAppendVertexGeometry(vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::PointQuadric
Definition: vtkQuadricClustering.h:344
vtkGetVector3Macro
#define vtkGetVector3Macro(name, type)
Definition: vtkSetGet.h:304
vtkQuadricClustering::NumberOfXDivisions
int NumberOfXDivisions
Definition: vtkQuadricClustering.h:311
vtkQuadricClustering::SetDivisionSpacing
void SetDivisionSpacing(double s[3])
Definition: vtkQuadricClustering.h:147
vtkQuadricClustering::SliceSize
vtkIdType SliceSize
Definition: vtkQuadricClustering.h:340
vtkQuadricClustering::YBinStep
double YBinStep
Definition: vtkQuadricClustering.h:338
vtkQuadricClustering::UseInternalTriangles
int UseInternalTriangles
Definition: vtkQuadricClustering.h:309
vtkQuadricClustering::GetFeatureEdges
vtkFeatureEdges * GetFeatureEdges()
Definition: vtkQuadricClustering.h:172
vtkQuadricClustering::AddVertex
void AddVertex(vtkIdType binId, double *pt, int geometryFlag, vtkPolyData *input, vtkPolyData *output)
vtkgl::num
GLuint GLuint num
Definition: vtkgl.h:16907
VTKFILTERSCORE_EXPORT
#define VTKFILTERSCORE_EXPORT
Definition: vtkFiltersCoreModule.h:15
vtkQuadricClustering
reduce the number of triangles in a mesh
Definition: vtkQuadricClustering.h:100
vtkIndent
a simple class to control print indentation
Definition: vtkIndent.h:39
vtkQuadricClustering::HashPoint
vtkIdType HashPoint(double point[3])
vtkCellArray
object to represent cell connectivity
Definition: vtkCellArray.h:50
vtkFeatureEdges
extract boundary, non-manifold, and/or sharp edges from polygonal data
Definition: vtkFeatureEdges.h:52
vtkQuadricClustering::PreventDuplicateCells
int PreventDuplicateCells
Definition: vtkQuadricClustering.h:316
vtkQuadricClustering::UseFeatureEdges
int UseFeatureEdges
Definition: vtkQuadricClustering.h:307
vtkQuadricClustering::NumberOfBinsUsed
vtkIdType NumberOfBinsUsed
Definition: vtkQuadricClustering.h:357
vtkGetMacro
#define vtkGetMacro(name, type)
Definition: vtkSetGet.h:93
vtkQuadricClustering::vtkQuadricClustering
vtkQuadricClustering()
vtkQuadricClustering::FeaturePointsAngle
double FeaturePointsAngle
Definition: vtkQuadricClustering.h:366
vtkQuadricClustering::AddEdge
void AddEdge(vtkIdType *binIds, double *pt0, double *pt1, int geometeryFlag, vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::StartAppend
void StartAppend(double x0, double x1, double y0, double y1, double z0, double z1)
Definition: vtkQuadricClustering.h:209
vtkQuadricClustering::CellSet
vtkQuadricClusteringCellSet * CellSet
Definition: vtkQuadricClustering.h:317
vtkBooleanMacro
vtkBooleanMacro(IgnoreDriverBugs, bool)
vtkQuadricClustering::AppendFeatureQuadrics
void AppendFeatureQuadrics(vtkPolyData *pd, vtkPolyData *output)
vtkInformation
Store vtkAlgorithm input/output information.
Definition: vtkInformation.h:86
vtkSetMacro
vtkSetMacro(IgnoreDriverBugs, bool)
vtkQuadricClustering::SetDivisionOrigin
void SetDivisionOrigin(double x, double y, double z)
vtkQuadricClustering::SetNumberOfZDivisions
void SetNumberOfZDivisions(int num)
vtkQuadricClustering::SetDivisionOrigin
void SetDivisionOrigin(double o[3])
Definition: vtkQuadricClustering.h:143
vtkgl::y
GLint GLint GLint GLint GLint GLint y
Definition: vtkgl.h:11318
vtkQuadricClustering::YBinSize
double YBinSize
Definition: vtkQuadricClustering.h:335
vtkQuadricClustering::XBinSize
double XBinSize
Definition: vtkQuadricClustering.h:334
vtkQuadricClustering::OutputLines
vtkCellArray * OutputLines
Definition: vtkQuadricClustering.h:362
vtkQuadricClustering::NumberOfBins
vtkIdType NumberOfBins
Definition: vtkQuadricClustering.h:318
vtkQuadricClustering::AddPolygons
void AddPolygons(vtkCellArray *polys, vtkPoints *points, int geometryFlag, vtkPolyData *input, vtkPolyData *output)
vtkQuadricClustering::InCellCount
int InCellCount
Definition: vtkQuadricClustering.h:369
vtkPolyData
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:84
vtkQuadricClustering::StartAppend
void StartAppend(double *bounds)
vtkQuadricClustering::RequestData
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *)
vtkgl::angle
GLfloat angle
Definition: vtkgl.h:18174
vtkQuadricClustering::PrintSelf
void PrintSelf(ostream &os, vtkIndent indent)
vtkQuadricClustering::FillInputPortInformation
int FillInputPortInformation(int, vtkInformation *)
vtkQuadricClustering::GetNumberOfDivisions
int * GetNumberOfDivisions()
vtkQuadricClustering::UseFeaturePoints
int UseFeaturePoints
Definition: vtkQuadricClustering.h:308
vtkQuadricClustering::Append
void Append(vtkPolyData *piece)
vtkQuadricClustering::EndAppend
void EndAppend()
vtkQuadricClustering::ComputeNumberOfDivisions
int ComputeNumberOfDivisions
Definition: vtkQuadricClustering.h:327
vtkQuadricClustering::XBinStep
double XBinStep
Definition: vtkQuadricClustering.h:337
vtkQuadricClustering::FindFeaturePoints
void FindFeaturePoints(vtkCellArray *edges, vtkPoints *edgePts, double angle)
vtkQuadricClustering::PointQuadric::Dimension
unsigned char Dimension
Definition: vtkQuadricClustering.h:351
vtkQuadricClustering::ZBinStep
double ZBinStep
Definition: vtkQuadricClustering.h:339
vtkQuadricClustering::FeaturePoints
vtkPoints * FeaturePoints
Definition: vtkQuadricClustering.h:365
vtkPolyDataAlgorithm
Superclass for algorithms that produce only polydata as output.
Definition: vtkPolyDataAlgorithm.h:44