Account for non-equal axis scaling during snapping

This commit is contained in:
Nyall Dawson 2022-04-15 09:22:52 +10:00
parent d163b4fb21
commit 5ff12f41e7
4 changed files with 5 additions and 3 deletions

View File

@ -25,7 +25,7 @@ Encapsulates the context of snapping a profile point.
double maximumElevationDelta;
double displayRationElevationVsDistance;
double displayRatioElevationVsDistance;
};

View File

@ -197,7 +197,7 @@ QgsProfileSnapResult QgsProfilePlotRenderer::snapPoint( const QgsProfilePoint &p
if ( jobSnapResult.isValid() )
{
const double snapDistance = std::pow( point.distance() - jobSnapResult.snappedPoint.distance(), 2 )
+ std::pow( point.elevation() - jobSnapResult.snappedPoint.elevation(), 2 );
+ std::pow( ( point.elevation() - jobSnapResult.snappedPoint.elevation() ) * context.displayRatioElevationVsDistance, 2 );
if ( snapDistance < bestSnapDistance )
{

View File

@ -38,7 +38,7 @@ class CORE_EXPORT QgsProfileSnapContext
double maximumElevationDelta = 0;
//! Display ratio of elevation vs distance units
double displayRationElevationVsDistance = 1;
double displayRatioElevationVsDistance = 1;
};

View File

@ -355,6 +355,8 @@ QgsProfileSnapContext QgsElevationProfileCanvas::snapContext() const
QgsProfileSnapContext context;
context.maximumDistanceDelta = xToleranceInPlotUnits;
context.maximumElevationDelta = yToleranceInPlotUnits;
context.displayRatioElevationVsDistance = ( ( mPlotItem->yMaximum() - mPlotItem->yMinimum() ) / ( mPlotItem->plotArea().height() ) )
/ ( ( mPlotItem->xMaximum() - mPlotItem->xMinimum() ) / ( mPlotItem->plotArea().width() ) );
return context;
}