VTK
vtkGreedyTerrainDecimation.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkGreedyTerrainDecimation.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 =========================================================================*/
70 #ifndef vtkGreedyTerrainDecimation_h
71 #define vtkGreedyTerrainDecimation_h
72 
73 #include "vtkFiltersHybridModule.h" // For export macro
74 #include "vtkPolyDataAlgorithm.h"
75 
76 class vtkPriorityQueue;
77 class vtkDataArray;
78 class vtkPointData;
79 class vtkIdList;
80 class vtkDoubleArray;
81 class vtkFloatArray;
82 
83 //PIMPL Encapsulation for STL containers
84 class vtkGreedyTerrainDecimationTerrainInfoType;
85 class vtkGreedyTerrainDecimationPointInfoType;
86 
87 #define VTK_ERROR_NUMBER_OF_TRIANGLES 0
88 #define VTK_ERROR_SPECIFIED_REDUCTION 1
89 #define VTK_ERROR_ABSOLUTE 2
90 #define VTK_ERROR_RELATIVE 3
91 
92 class VTKFILTERSHYBRID_EXPORT vtkGreedyTerrainDecimation : public vtkPolyDataAlgorithm
93 {
94 public:
96  void PrintSelf(ostream& os, vtkIndent indent) override;
97 
102 
104 
110  vtkSetClampMacro(ErrorMeasure,int,VTK_ERROR_NUMBER_OF_TRIANGLES,VTK_ERROR_RELATIVE);
111  vtkGetMacro(ErrorMeasure,int);
113  {this->SetErrorMeasure(VTK_ERROR_NUMBER_OF_TRIANGLES);}
115  {this->SetErrorMeasure(VTK_ERROR_SPECIFIED_REDUCTION);}
117  {this->SetErrorMeasure(VTK_ERROR_ABSOLUTE);}
119  {this->SetErrorMeasure(VTK_ERROR_RELATIVE);}
121 
123 
129  vtkSetClampMacro(NumberOfTriangles,vtkIdType,2,VTK_ID_MAX);
130  vtkGetMacro(NumberOfTriangles,vtkIdType);
132 
134 
139  vtkSetClampMacro(Reduction,double,0.0,1.0);
140  vtkGetMacro(Reduction,double);
142 
144 
149  vtkSetClampMacro(AbsoluteError,double,0.0,VTK_DOUBLE_MAX);
150  vtkGetMacro(AbsoluteError,double);
152 
154 
160  vtkSetClampMacro(RelativeError,double,0.0,VTK_DOUBLE_MAX);
161  vtkGetMacro(RelativeError,double);
163 
165 
169  vtkSetMacro(BoundaryVertexDeletion,vtkTypeBool);
170  vtkGetMacro(BoundaryVertexDeletion,vtkTypeBool);
171  vtkBooleanMacro(BoundaryVertexDeletion,vtkTypeBool);
173 
175 
178  vtkSetMacro(ComputeNormals, vtkTypeBool);
179  vtkGetMacro(ComputeNormals, vtkTypeBool);
180  vtkBooleanMacro(ComputeNormals, vtkTypeBool);
182 
183 protected:
185  ~vtkGreedyTerrainDecimation() override;
186 
188  int FillInputPortInformation(int port, vtkInformation *info) override;
189 
192  void ComputePointNormal(int i, int j, float n[3]);
193 
194  //ivars that the API addresses
197  double Reduction;
200  vtkTypeBool BoundaryVertexDeletion; //Can we delete boundary vertices?
201 
202  //Used for convenience
209  double Tolerance;
211  int Dimensions[3];
212  double Origin[3];
213  double Spacing[3];
215  double Length;
216 
217  //Bookkeeping arrays
218  vtkPriorityQueue *TerrainError; //errors for each pt in height field
219  vtkGreedyTerrainDecimationTerrainInfoType *TerrainInfo; //owning triangle for each pt
220  vtkGreedyTerrainDecimationPointInfoType *PointInfo; //map mesh pt id to input pt id
221 
222  //Make a guess at initial allocation
223  void EstimateOutputSize(const vtkIdType numInputPts, vtkIdType &numPts, vtkIdType &numTris);
224 
225  //Returns non-zero if the error measure is satisfied.
226  virtual int SatisfiesErrorMeasure(double error);
227 
228  //Insert all the boundary vertices into the TIN
229  void InsertBoundaryVertices();
230 
231  //Insert a point into the triangulation; get a point from the triangulation
232  vtkIdType AddPointToTriangulation(vtkIdType inputPtId);
233  vtkIdType InsertNextPoint(vtkIdType inputPtId, double x[3]);
234  double *GetPoint(vtkIdType id);
235  void GetPoint(vtkIdType id, double x[3]);
236 
237  //Helper functions
238  void GetTerrainPoint(int i, int j, double x[3]);
239  void ComputeImageCoordinates(vtkIdType inputPtId, int ij[2]);
240  int InCircle (double x[3], double x1[3], double x2[3], double x3[3]);
241  vtkIdType FindTriangle(double x[3], vtkIdType ptIds[3], vtkIdType tri,
242  double tol, vtkIdType nei[3], vtkIdList *neighbors, int& status);
243  void CheckEdge(vtkIdType ptId, double x[3], vtkIdType p1, vtkIdType p2,
244  vtkIdType tri, int depth);
245 
246  void UpdateTriangles(vtkIdType meshPtId); //update all points connected to this point
247  void UpdateTriangle(vtkIdType triId, vtkIdType p1, vtkIdType p2, vtkIdType p3);
248  void UpdateTriangle(vtkIdType triId, int ij1[2], int ij2[2], int ij3[2], double h[4]);
249 
250  int CharacterizeTriangle(int ij1[2], int ij2[2], int ij[3],
251  int* &min, int* &max, int* &midL, int* &midR,
252  int* &mid, int mid2[2], double h[3], double &hMin, double &hMax,
253  double &hL, double &hR);
254 
255 private:
257  void operator=(const vtkGreedyTerrainDecimation&) = delete;
258 
259 };
260 
261 #endif
#define VTK_ERROR_SPECIFIED_REDUCTION
represent and manipulate point attribute data
Definition: vtkPointData.h:37
#define VTK_DOUBLE_MAX
Definition: vtkType.h:169
Store vtkAlgorithm input/output information.
virtual int RequestData(vtkInformation *request, vtkInformationVector **inputVector, vtkInformationVector *outputVector)
This is called by the superclass.
dynamic, self-adjusting array of float
Definition: vtkFloatArray.h:41
vtkGreedyTerrainDecimationPointInfoType * PointInfo
void SetErrorMeasureToAbsoluteError()
Specify how to terminate the algorithm: either as an absolute number of triangles, a relative number of triangles (normalized by the full resolution mesh), an absolute error (in the height field), or relative error (normalized by the length of the diagonal of the image).
int vtkIdType
Definition: vtkType.h:347
concrete dataset represents vertices, lines, polygons, and triangle strips
Definition: vtkPolyData.h:85
void GetPoint(const int i, const int j, const int k, double pnt[3])
dynamic, self-adjusting array of double
a list of ids arranged in priority order
static vtkPolyDataAlgorithm * New()
int vtkTypeBool
Definition: vtkABI.h:69
Superclass for algorithms that produce only polydata as output.
#define VTK_ERROR_ABSOLUTE
void SetErrorMeasureToRelativeError()
Specify how to terminate the algorithm: either as an absolute number of triangles, a relative number of triangles (normalized by the full resolution mesh), an absolute error (in the height field), or relative error (normalized by the length of the diagonal of the image).
a simple class to control print indentation
Definition: vtkIndent.h:39
list of point or cell ids
Definition: vtkIdList.h:36
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:54
vtkGreedyTerrainDecimationTerrainInfoType * TerrainInfo
void SetErrorMeasureToNumberOfTriangles()
Specify how to terminate the algorithm: either as an absolute number of triangles, a relative number of triangles (normalized by the full resolution mesh), an absolute error (in the height field), or relative error (normalized by the length of the diagonal of the image).
#define VTK_ERROR_NUMBER_OF_TRIANGLES
void SetErrorMeasureToSpecifiedReduction()
Specify how to terminate the algorithm: either as an absolute number of triangles, a relative number of triangles (normalized by the full resolution mesh), an absolute error (in the height field), or relative error (normalized by the length of the diagonal of the image).
#define VTK_ID_MAX
Definition: vtkType.h:351
#define VTK_ERROR_RELATIVE
int FillInputPortInformation(int port, vtkInformation *info) override
Fill the input port information objects for this algorithm.
Store zero or more vtkInformation instances.
reduce height field (represented as image) to reduced TIN
#define max(a, b)
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.