00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef NORMVECDECORATOR_H
00018 #define NORMVECDECORATOR_H
00019
00020 #include "TriDecorator.h"
00021 #include <TriangleInterpolator.h>
00022 #include <MathUtils.h>
00023 #include "qgslogger.h"
00024 class QProgressDialog;
00025
00027 class ANALYSIS_EXPORT NormVecDecorator: public TriDecorator
00028 {
00029 public:
00031 enum pointState {NORMAL, BREAKLINE, ENDPOINT};
00032 NormVecDecorator();
00033 NormVecDecorator( Triangulation* tin );
00034 virtual ~NormVecDecorator();
00036 int addPoint( Point3D* p );
00038 bool calcNormal( double x, double y, Vector3D* result );
00040 bool calcNormalForPoint( double x, double y, int point, Vector3D* result );
00042 bool calcPoint( double x, double y, Point3D* result );
00044 virtual void eliminateHorizontalTriangles();
00046 bool estimateFirstDerivative( int pointno );
00048 bool estimateFirstDerivatives( QProgressDialog* d = 0 );
00050 Vector3D* getNormal( int n ) const;
00052 bool getTriangle( double x, double y, Point3D* p1, Vector3D* v1, Point3D* p2, Vector3D* v2, Point3D* p3, Vector3D* v3 );
00054 bool getTriangle( double x, double y, Point3D* p1, int* ptn1, Vector3D* v1, pointState* state1, Point3D* p2, int* ptn2, Vector3D* v2, pointState* state2, Point3D* p3, int* ptn3, Vector3D* v3, pointState* state3 );
00056 pointState getState( int pointno ) const;
00058 void setTriangleInterpolator( TriangleInterpolator* inter );
00060 virtual bool swapEdge( double x, double y );
00063 virtual bool saveAsShapefile( const QString& fileName ) const;
00064
00065 protected:
00067 bool alreadyestimated;
00068 const static unsigned int mDefaultStorageForNormals = 100000;
00070 TriangleInterpolator* mInterpolator;
00072 QVector<Vector3D*>* mNormVec;
00074 QVector<pointState>* mPointState;
00076 void setState( int pointno, pointState s );
00077 };
00078
00079 inline NormVecDecorator::NormVecDecorator(): TriDecorator(), mInterpolator( 0 ), mNormVec( new QVector<Vector3D*>( mDefaultStorageForNormals ) ), mPointState( new QVector<pointState>( mDefaultStorageForNormals ) )
00080 {
00081 alreadyestimated = false;
00082 }
00083
00084 inline NormVecDecorator::NormVecDecorator( Triangulation* tin ): TriDecorator( tin ), mInterpolator( 0 ), mNormVec( new QVector<Vector3D*>( mDefaultStorageForNormals ) ), mPointState( new QVector<pointState>( mDefaultStorageForNormals ) )
00085 {
00086 alreadyestimated = false;
00087 }
00088
00089 inline void NormVecDecorator::setTriangleInterpolator( TriangleInterpolator* inter )
00090 {
00091 mInterpolator = inter;
00092 }
00093
00094 inline Vector3D* NormVecDecorator::getNormal( int n ) const
00095 {
00096 if ( mNormVec )
00097 {
00098 return mNormVec->at( n );
00099 }
00100 else
00101 {
00102 QgsDebugMsg( "warning, null pointer" );
00103 return 0;
00104 }
00105 }
00106
00107 #endif