Main Page | Class Hierarchy | Alphabetical List | Class List | File List | Class Members | File Members | Related Pages

dox/Hybrid/vtkGreedyTerrainDecimation.h

Go to the documentation of this file.
00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkGreedyTerrainDecimation.h,v $ 00005 00006 Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen 00007 All rights reserved. 00008 See Copyright.txt or http://www.kitware.com/Copyright.htm for details. 00009 00010 This software is distributed WITHOUT ANY WARRANTY; without even 00011 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00012 PURPOSE. See the above copyright notice for more information. 00013 00014 =========================================================================*/ 00069 #ifndef __vtkGreedyTerrainDecimation_h 00070 #define __vtkGreedyTerrainDecimation_h 00071 00072 #include "vtkStructuredPointsToPolyDataFilter.h" 00073 00074 class vtkPriorityQueue; 00075 class vtkDataArray; 00076 class vtkPointData; 00077 class vtkIdList; 00078 class vtkDoubleArray; 00079 00080 //PIMPL Encapsulation for STL containers 00081 class vtkGreedyTerrainDecimationTerrainInfoType; 00082 class vtkGreedyTerrainDecimationPointInfoType; 00083 00084 #define VTK_ERROR_NUMBER_OF_TRIANGLES 0 00085 #define VTK_ERROR_SPECIFIED_REDUCTION 1 00086 #define VTK_ERROR_ABSOLUTE 2 00087 #define VTK_ERROR_RELATIVE 3 00088 00089 class VTK_HYBRID_EXPORT vtkGreedyTerrainDecimation : public vtkStructuredPointsToPolyDataFilter 00090 { 00091 public: 00092 vtkTypeRevisionMacro(vtkGreedyTerrainDecimation,vtkStructuredPointsToPolyDataFilter); 00093 void PrintSelf(ostream& os, vtkIndent indent); 00094 00096 static vtkGreedyTerrainDecimation* New(); 00097 00099 00104 vtkSetClampMacro(ErrorMeasure,int,VTK_ERROR_NUMBER_OF_TRIANGLES,VTK_ERROR_RELATIVE); 00105 vtkGetMacro(ErrorMeasure,int); 00106 void SetErrorMeasureToNumberOfTriangles() 00107 {this->SetErrorMeasure(VTK_ERROR_NUMBER_OF_TRIANGLES);} 00108 void SetErrorMeasureToSpecifiedReduction() 00109 {this->SetErrorMeasure(VTK_ERROR_SPECIFIED_REDUCTION);} 00110 void SetErrorMeasureToAbsoluteError() 00111 {this->SetErrorMeasure(VTK_ERROR_ABSOLUTE);} 00112 void SetErrorMeasureToRelativeError() 00113 {this->SetErrorMeasure(VTK_ERROR_RELATIVE);} 00115 00117 00121 vtkSetClampMacro(NumberOfTriangles,vtkIdType,2,VTK_LONG_MAX); 00122 vtkGetMacro(NumberOfTriangles,vtkIdType); 00124 00126 00129 vtkSetClampMacro(Reduction,double,0.0,1.0); 00130 vtkGetMacro(Reduction,double); 00132 00134 00138 vtkSetClampMacro(AbsoluteError,double,0.0,VTK_DOUBLE_MAX); 00139 vtkGetMacro(AbsoluteError,double); 00141 00143 00147 vtkSetClampMacro(RelativeError,double,0.0,VTK_DOUBLE_MAX); 00148 vtkGetMacro(RelativeError,double); 00150 00152 00154 vtkSetMacro(BoundaryVertexDeletion,int); 00155 vtkGetMacro(BoundaryVertexDeletion,int); 00156 vtkBooleanMacro(BoundaryVertexDeletion,int); 00158 00159 protected: 00160 vtkGreedyTerrainDecimation(); 00161 ~vtkGreedyTerrainDecimation(); 00162 00163 void Execute(); 00164 00165 //ivars that the API addresses 00166 int ErrorMeasure; 00167 vtkIdType NumberOfTriangles; 00168 double Reduction; 00169 double AbsoluteError; 00170 double RelativeError; 00171 int BoundaryVertexDeletion; //Can we delete boundary vertices? 00172 00173 //Used for convenience 00174 vtkPolyData *Mesh; 00175 vtkPointData *InputPD; 00176 vtkPointData *OutputPD; 00177 vtkDoubleArray *Points; 00178 vtkDataArray *Heights; 00179 vtkIdType CurrentPointId; 00180 double Tolerance; 00181 vtkIdList *Neighbors; 00182 int Dimensions[3]; 00183 double Origin[3]; 00184 double Spacing[3]; 00185 vtkIdType MaximumNumberOfTriangles; 00186 double Length; 00187 00188 //Bookeeping arrays 00189 vtkPriorityQueue *TerrainError; //errors for each pt in height field 00190 vtkGreedyTerrainDecimationTerrainInfoType *TerrainInfo; //owning triangle for each pt 00191 vtkGreedyTerrainDecimationPointInfoType *PointInfo; //map mesh pt id to input pt id 00192 00193 //Make a guess at initial allocation 00194 void EstimateOutputSize(const vtkIdType numInputPts, vtkIdType &numPts, vtkIdType &numTris); 00195 00196 //Returns non-zero if the error measure is satisfied. 00197 virtual int SatisfiesErrorMeasure(double error); 00198 00199 //Insert all the boundary vertices into the TIN 00200 void InsertBoundaryVertices(); 00201 00202 //Insert a point into the triangulation; get a point from the triangulation 00203 vtkIdType AddPointToTriangulation(vtkIdType inputPtId); 00204 vtkIdType InsertNextPoint(vtkIdType inputPtId, double x[3]); 00205 double *GetPoint(vtkIdType id); 00206 void GetPoint(vtkIdType id, double x[3]); 00207 00208 //Helper functions 00209 void GetTerrainPoint(int i, int j, double x[3]); 00210 void ComputeImageCoordinates(vtkIdType inputPtId, int ij[2]); 00211 int InCircle (double x[3], double x1[3], double x2[3], double x3[3]); 00212 vtkIdType FindTriangle(double x[3], vtkIdType ptIds[3], vtkIdType tri, 00213 double tol, vtkIdType nei[3], vtkIdList *neighbors, int& status); 00214 void CheckEdge(vtkIdType ptId, double x[3], vtkIdType p1, vtkIdType p2, 00215 vtkIdType tri); 00216 00217 void UpdateTriangles(vtkIdType meshPtId); //update all points connected to this point 00218 void UpdateTriangle(vtkIdType triId, vtkIdType p1, vtkIdType p2, vtkIdType p3); 00219 void UpdateTriangle(vtkIdType triId, int ij1[2], int ij2[2], int ij3[2], double h[4]); 00220 00221 int CharacterizeTriangle(int ij1[2], int ij2[2], int ij[3], 00222 int* &min, int* &max, int* &midL, int* &midR, 00223 int* &mid, int mid2[2], double h[3], double &hMin, double &hMax, 00224 double &hL, double &hR); 00225 00226 private: 00227 vtkGreedyTerrainDecimation(const vtkGreedyTerrainDecimation&); // Not implemented. 00228 void operator=(const vtkGreedyTerrainDecimation&); // Not implemented. 00229 00230 }; 00231 00232 #endif 00233