VTK  9.3.20240328
vtkDecimatePro.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
150 #ifndef vtkDecimatePro_h
151 #define vtkDecimatePro_h
152 
153 #include "vtkFiltersCoreModule.h" // For export macro
154 #include "vtkPolyDataAlgorithm.h"
155 
156 #include "vtkCell.h" // Needed for VTK_CELL_SIZE
157 
158 VTK_ABI_NAMESPACE_BEGIN
159 class vtkDoubleArray;
160 class vtkPriorityQueue;
161 
162 class VTKFILTERSCORE_EXPORT vtkDecimatePro : public vtkPolyDataAlgorithm
163 {
164 public:
166  void PrintSelf(ostream& os, vtkIndent indent) override;
167 
176  static vtkDecimatePro* New();
177 
179 
188  vtkSetClampMacro(TargetReduction, double, 0.0, 1.0);
189  vtkGetMacro(TargetReduction, double);
191 
193 
198  vtkSetMacro(PreserveTopology, vtkTypeBool);
199  vtkGetMacro(PreserveTopology, vtkTypeBool);
200  vtkBooleanMacro(PreserveTopology, vtkTypeBool);
202 
204 
209  vtkSetClampMacro(FeatureAngle, double, 0.0, 180.0);
210  vtkGetMacro(FeatureAngle, double);
212 
214 
220  vtkSetMacro(Splitting, vtkTypeBool);
221  vtkGetMacro(Splitting, vtkTypeBool);
222  vtkBooleanMacro(Splitting, vtkTypeBool);
224 
226 
231  vtkSetClampMacro(SplitAngle, double, 0.0, 180.0);
232  vtkGetMacro(SplitAngle, double);
234 
236 
244  vtkSetMacro(PreSplitMesh, vtkTypeBool);
245  vtkGetMacro(PreSplitMesh, vtkTypeBool);
246  vtkBooleanMacro(PreSplitMesh, vtkTypeBool);
248 
250 
256  vtkSetClampMacro(MaximumError, double, 0.0, VTK_DOUBLE_MAX);
257  vtkGetMacro(MaximumError, double);
259 
261 
269  vtkSetMacro(AccumulateError, vtkTypeBool);
270  vtkGetMacro(AccumulateError, vtkTypeBool);
271  vtkBooleanMacro(AccumulateError, vtkTypeBool);
273 
275 
280  vtkSetMacro(ErrorIsAbsolute, int);
281  vtkGetMacro(ErrorIsAbsolute, int);
283 
285 
288  vtkSetClampMacro(AbsoluteError, double, 0.0, VTK_DOUBLE_MAX);
289  vtkGetMacro(AbsoluteError, double);
291 
293 
297  vtkSetMacro(BoundaryVertexDeletion, vtkTypeBool);
298  vtkGetMacro(BoundaryVertexDeletion, vtkTypeBool);
299  vtkBooleanMacro(BoundaryVertexDeletion, vtkTypeBool);
301 
303 
309  vtkSetClampMacro(Degree, int, 25, VTK_CELL_SIZE);
310  vtkGetMacro(Degree, int);
312 
314 
319  vtkSetClampMacro(InflectionPointRatio, double, 1.001, VTK_DOUBLE_MAX);
320  vtkGetMacro(InflectionPointRatio, double);
322 
331 
338  void GetInflectionPoints(double* inflectionPoints);
339 
348 
350 
355  vtkSetMacro(OutputPointsPrecision, int);
356  vtkGetMacro(OutputPointsPrecision, int);
358 
359 protected:
361  ~vtkDecimatePro() override;
362 
364 
366  double FeatureAngle;
367  double MaximumError;
371  double SplitAngle;
376  int Degree;
380 
381  // to replace a static object
384 
385  void SplitMesh();
386  int EvaluateVertex(vtkIdType ptId, vtkIdType numTris, vtkIdType* tris, vtkIdType fedges[2]);
388  int type, vtkIdType fedges[2], vtkIdType& pt1, vtkIdType& pt2, vtkIdList* CollapseTris);
389  int IsValidSplit(int index);
390  void SplitLoop(vtkIdType fedges[2], vtkIdType& n1, vtkIdType* l1, vtkIdType& n2, vtkIdType* l2);
391  void SplitVertex(vtkIdType ptId, int type, vtkIdType numTris, vtkIdType* tris, int insert);
392  int CollapseEdge(int type, vtkIdType ptId, vtkIdType collapseId, vtkIdType pt1, vtkIdType pt2,
393  vtkIdList* CollapseTris);
394  void DistributeError(double error);
395 
396  //
397  // Special classes for manipulating data
398  //
399  // Special structures for building loops
401  {
402  public:
404  double x[3];
405  double FAngle;
406  };
408 
409  class LocalTri
410  {
411  public:
413  double area;
414  double n[3];
415  vtkIdType verts[3];
416  };
418 
419  class VertexArray;
420  friend class VertexArray;
422  { //;prevent man page generation
423  public:
425  {
426  this->MaxId = -1;
427  this->Array = new LocalVertex[sz];
428  }
429  ~VertexArray() { delete[] this->Array; }
430  vtkIdType GetNumberOfVertices() { return this->MaxId + 1; }
432  {
433  this->MaxId++;
434  this->Array[this->MaxId] = v;
435  }
436  LocalVertex& GetVertex(vtkIdType i) { return this->Array[i]; }
437  void Reset() { this->MaxId = -1; }
438 
439  LocalVertex* Array; // pointer to data
440  vtkIdType MaxId; // maximum index inserted thus far
441  };
442 
443  class TriArray;
444  friend class TriArray;
445  class TriArray
446  { //;prevent man page generation
447  public:
448  TriArray(const vtkIdType sz)
449  {
450  this->MaxId = -1;
451  this->Array = new LocalTri[sz];
452  }
453  ~TriArray() { delete[] this->Array; }
454  vtkIdType GetNumberOfTriangles() { return this->MaxId + 1; }
456  {
457  this->MaxId++;
458  this->Array[this->MaxId] = t;
459  }
460  LocalTri& GetTriangle(vtkIdType i) { return this->Array[i]; }
461  void Reset() { this->MaxId = -1; }
462 
463  LocalTri* Array; // pointer to data
464  vtkIdType MaxId; // maximum index inserted thus far
465  };
466 
467 private:
468  void InitializeQueue(vtkIdType numPts);
469  void DeleteQueue();
470  void Insert(vtkIdType id, double error = -1.0);
471  int Pop(double& error);
472  double DeleteId(vtkIdType id);
473  void Reset();
474 
475  vtkPriorityQueue* Queue;
476  vtkDoubleArray* VertexError;
477 
478  VertexArray* V;
479  TriArray* T;
480 
481  // Use to be static variables used by object
482  vtkPolyData* Mesh; // operate on this data structure
483  double Pt[3]; // least squares plane point
484  double Normal[3]; // least squares plane normal
485  double LoopArea; // the total area of all triangles in a loop
486  double CosAngle; // Cosine of dihedral angle
487  double Tolerance; // Intersection tolerance
488  double X[3]; // coordinates of current point
489  int NumCollapses; // Number of times edge collapses occur
490  int NumMerges; // Number of times vertex merges occur
491  int Split; // Controls whether and when vertex splitting occurs
492  int VertexDegree; // Maximum number of triangles that can use a vertex
493  vtkIdType NumberOfRemainingTris; // Number of triangles left in the mesh
494  double TheSplitAngle; // Split angle
495  int SplitState; // State of the splitting process
496  double Error; // Maximum allowable surface error
497 
498  vtkDecimatePro(const vtkDecimatePro&) = delete;
499  void operator=(const vtkDecimatePro&) = delete;
500 };
501 
502 VTK_ABI_NAMESPACE_END
503 #endif
void InsertNextTriangle(LocalTri &t)
TriArray(const vtkIdType sz)
vtkIdType GetNumberOfTriangles()
LocalTri & GetTriangle(vtkIdType i)
VertexArray(const vtkIdType sz)
LocalVertex & GetVertex(vtkIdType i)
void InsertNextVertex(LocalVertex &v)
reduce the number of triangles in a mesh
double TargetReduction
void SplitVertex(vtkIdType ptId, int type, vtkIdType numTris, vtkIdType *tris, int insert)
void GetInflectionPoints(double *inflectionPoints)
Get a list of inflection points.
int CollapseEdge(int type, vtkIdType ptId, vtkIdType collapseId, vtkIdType pt1, vtkIdType pt2, vtkIdList *CollapseTris)
LocalTri * LocalTriPtr
vtkDoubleArray * InflectionPoints
~vtkDecimatePro() override
vtkIdList * Neighbors
static vtkDecimatePro * New()
Create object with specified reduction of 90% and feature angle of 15 degrees.
void DistributeError(double error)
LocalVertex * LocalVertexPtr
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
int IsValidSplit(int index)
int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *) override
This is called by the superclass.
int EvaluateVertex(vtkIdType ptId, vtkIdType numTris, vtkIdType *tris, vtkIdType fedges[2])
vtkTypeBool PreserveTopology
double * GetInflectionPoints()
Get a list of inflection points.
double InflectionPointRatio
vtkIdType GetNumberOfInflectionPoints()
Get the number of inflection points.
vtkTypeBool BoundaryVertexDeletion
vtkIdType FindSplit(int type, vtkIdType fedges[2], vtkIdType &pt1, vtkIdType &pt2, vtkIdList *CollapseTris)
vtkPriorityQueue * EdgeLengths
vtkTypeBool Splitting
vtkTypeBool PreSplitMesh
vtkTypeBool AccumulateError
void SplitLoop(vtkIdType fedges[2], vtkIdType &n1, vtkIdType *l1, vtkIdType &n2, vtkIdType *l2)
dynamic, self-adjusting array of double
list of point or cell ids
Definition: vtkIdList.h:132
a simple class to control print indentation
Definition: vtkIndent.h:108
Store zero or more vtkInformation instances.
Store vtkAlgorithm input/output information.
Superclass for algorithms that produce only polydata as output.
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:180
a list of ids arranged in priority order
@ Normal
Definition: vtkX3D.h:45
@ type
Definition: vtkX3D.h:516
@ index
Definition: vtkX3D.h:246
int vtkTypeBool
Definition: vtkABI.h:64
#define VTK_CELL_SIZE
Definition: vtkCell.h:110
int vtkIdType
Definition: vtkType.h:315
#define VTK_DOUBLE_MAX
Definition: vtkType.h:154