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

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