Skip to content

Commit

Permalink
Improved robustness of constrained triangulation. Added a progress di…
Browse files Browse the repository at this point in the history
…alog for normal vector estimation

git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12221 c8812cc2-4d05-0410-92ff-de0c093fc19c
  • Loading branch information
mhugent committed Nov 22, 2009
1 parent 4305ae2 commit 13154cb
Show file tree
Hide file tree
Showing 5 changed files with 37 additions and 10 deletions.
3 changes: 3 additions & 0 deletions src/analysis/interpolation/DualEdgeTriangulation.cc
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,7 @@ int DualEdgeTriangulation::baseEdgeOfPoint( int point )
// QgsDebugMsg( "warning, endless loop" );

//use the secure and slow method
//qWarning( "******************warning, using the slow method in baseEdgeOfPoint****************************************" );
for ( int i = 0;i < mHalfEdge.count();i++ )
{
if ( mHalfEdge[i]->getPoint() == point && mHalfEdge[mHalfEdge[i]->getNext()]->getPoint() != -1 )//we found it
Expand All @@ -444,6 +445,7 @@ int DualEdgeTriangulation::baseEdgeOfPoint( int point )
{
if ( mHalfEdge[i]->getPoint() == point && mHalfEdge[mHalfEdge[i]->getNext()]->getPoint() != -1 )//we found it
{
mEdgeInside = i;
return i;
}
}
Expand All @@ -454,6 +456,7 @@ int DualEdgeTriangulation::baseEdgeOfPoint( int point )

if ( mHalfEdge[actedge]->getPoint() == point && mHalfEdge[mHalfEdge[actedge]->getNext()]->getPoint() != -1 )//we found the edge
{
mEdgeInside = actedge;
return actedge;
break;
}
Expand Down
6 changes: 3 additions & 3 deletions src/analysis/interpolation/DualEdgeTriangulation.h
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ class ANALYSIS_EXPORT DualEdgeTriangulation: public Triangulation
/**Y-coordinate of the lower left corner of the bounding box*/
double yMin;
/**Default value for the number of storable points at the beginning*/
const static unsigned int mDefaultStorageForPoints = 50000;
const static unsigned int mDefaultStorageForPoints = 100000;
/**Stores pointers to all points in the triangulations (including the points contained in the lines)*/
QVector<Point3D*> mPointVector;
/**Default value for the number of storable HalfEdges at the beginning*/
Expand Down Expand Up @@ -182,13 +182,13 @@ class ANALYSIS_EXPORT DualEdgeTriangulation: public Triangulation
void evaluateInfluenceRegion( Point3D* point, int edge, std::set<int>* set );
};

inline DualEdgeTriangulation::DualEdgeTriangulation() : xMax( 0 ), xMin( 0 ), yMax( 0 ), yMin( 0 ), mTriangleInterpolator( 0 ), mForcedCrossBehaviour( Triangulation::INSERT_VERTICE ), mEdgeColor( 0, 255, 0 ), mForcedEdgeColor( 0, 0, 255 ), mBreakEdgeColor( 100, 100, 0 ), mDecorator( this )
inline DualEdgeTriangulation::DualEdgeTriangulation() : xMax( 0 ), xMin( 0 ), yMax( 0 ), yMin( 0 ), mTriangleInterpolator( 0 ), mForcedCrossBehaviour( Triangulation::DELETE_FIRST ), mEdgeColor( 0, 255, 0 ), mForcedEdgeColor( 0, 0, 255 ), mBreakEdgeColor( 100, 100, 0 ), mDecorator( this )
{
mPointVector.reserve( mDefaultStorageForPoints );
mHalfEdge.reserve( mDefaultStorageForHalfEdges );
}

inline DualEdgeTriangulation::DualEdgeTriangulation( int nop, Triangulation* decorator ): xMax( 0 ), xMin( 0 ), yMax( 0 ), yMin( 0 ), mTriangleInterpolator( 0 ), mForcedCrossBehaviour( Triangulation::INSERT_VERTICE ), mEdgeColor( 0, 255, 0 ), mForcedEdgeColor( 0, 0, 255 ), mBreakEdgeColor( 100, 100, 0 ), mDecorator( decorator )
inline DualEdgeTriangulation::DualEdgeTriangulation( int nop, Triangulation* decorator ): xMax( 0 ), xMin( 0 ), yMax( 0 ), yMin( 0 ), mTriangleInterpolator( 0 ), mForcedCrossBehaviour( Triangulation::DELETE_FIRST ), mEdgeColor( 0, 255, 0 ), mForcedEdgeColor( 0, 0, 255 ), mBreakEdgeColor( 100, 100, 0 ), mDecorator( decorator )
{
mPointVector.reserve( nop );
mHalfEdge.reserve( nop );
Expand Down
24 changes: 20 additions & 4 deletions src/analysis/interpolation/NormVecDecorator.cc
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

#include "NormVecDecorator.h"
#include "qgslogger.h"
#include <QApplication>
#include <QProgressDialog>

NormVecDecorator::~NormVecDecorator()
{
Expand Down Expand Up @@ -482,7 +484,6 @@ bool NormVecDecorator::estimateFirstDerivative( int pointno )
//insert the new calculated vector
if ( mNormVec->size() <= mNormVec->count() )//allocate more memory if neccessary
{
QgsDebugMsg( QString( "resizing mNormVec from %1 to %2" ).arg( mNormVec->size() ).arg( mNormVec->size() + 1 ) );
mNormVec->resize( mNormVec->size() + 1 );
}

Expand All @@ -502,7 +503,6 @@ bool NormVecDecorator::estimateFirstDerivative( int pointno )

if ( pointno >= mPointState->size() )
{
QgsDebugMsg( QString( "resizing mPointState from %1 to %2" ).arg( mPointState->size() ).arg( mPointState->size() + 1 ) );
mPointState->resize( mPointState->size() + 1 );
}

Expand All @@ -512,14 +512,30 @@ bool NormVecDecorator::estimateFirstDerivative( int pointno )
}

//weighted method of little
bool NormVecDecorator::estimateFirstDerivatives()
bool NormVecDecorator::estimateFirstDerivatives( QProgressDialog* d )
{
if ( d )
{
d->setMinimum( 0 );
d->setMaximum( getNumberOfPoints() );
d->setCancelButton( 0 ); //we cannot cancel derivative estimation
d->show();
}

for ( int i = 0; i < getNumberOfPoints(); i++ )
{
if ( d )
{
d->setValue( i );
}
estimateFirstDerivative( i );
}
return true;

if ( d )
{
d->setValue( getNumberOfPoints() );
}
return true;
}

void NormVecDecorator::eliminateHorizontalTriangles()
Expand Down
5 changes: 3 additions & 2 deletions src/analysis/interpolation/NormVecDecorator.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
#include <TriangleInterpolator.h>
#include <MathUtils.h>
#include "qgslogger.h"
class QProgressDialog;

/**Decorator class which adds the functionality of estimating normals at the data points*/
class ANALYSIS_EXPORT NormVecDecorator: public TriDecorator
Expand All @@ -44,7 +45,7 @@ class ANALYSIS_EXPORT NormVecDecorator: public TriDecorator
/**Estimates the first derivative a point. Return true in case of succes and false otherwise*/
bool estimateFirstDerivative( int pointno );
/**This method adds the functionality of estimating normals at the data points. Return true in the case of success and false otherwise*/
bool estimateFirstDerivatives();
bool estimateFirstDerivatives( QProgressDialog* d = 0 );
/**Returns a pointer to the normal vector for the point with the number n*/
Vector3D* getNormal( int n ) const;
/**Finds out, in which triangle a point with coordinates x and y is and assigns the triangle points to p1, p2, p3 and the estimated normals to v1, v2, v3. The vectors are normaly taken from 'mNormVec', exept if p1, p2 or p3 is a point on a breakline. In this case, the normal is calculated on-the-fly. Returns false, if something went wrong and true otherwise*/
Expand All @@ -64,7 +65,7 @@ class ANALYSIS_EXPORT NormVecDecorator: public TriDecorator
protected:
/**Is true, if the normals already have been estimated*/
bool alreadyestimated;
const static unsigned int mDefaultStorageForNormals = 50000;
const static unsigned int mDefaultStorageForNormals = 100000;
/**Association with an interpolator object*/
TriangleInterpolator* mInterpolator;
/**Vector that stores the normals for the points. If 'estimateFirstDerivatives()' was called and there is a null pointer, this means, that the triangle point is on a breakline*/
Expand Down
9 changes: 8 additions & 1 deletion src/analysis/interpolation/qgstininterpolator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,14 @@ void QgsTINInterpolator::initialize()
NormVecDecorator* dec = dynamic_cast<NormVecDecorator*>( mTriangulation );
if ( dec )
{
dec->estimateFirstDerivatives();
QProgressDialog* progressDialog = 0;
if ( mShowProgressDialog ) //show a progress dialog because it can take a long time...
{
progressDialog = new QProgressDialog();
progressDialog->setLabelText( QObject::tr( "Estimating normal derivatives..." ) );
}
dec->estimateFirstDerivatives( progressDialog );
delete progressDialog;
ctInterpolator->setTriangulation( dec );
dec->setTriangleInterpolator( ctInterpolator );
mTriangleInterpolator = ctInterpolator;
Expand Down

0 comments on commit 13154cb

Please sign in to comment.