Skip to content

Commit 1d3f1f0

Browse files
committedNov 14, 2016
Fix QgsGeometryUtils::sqrDistToLine returns bad values (eg nan values)
1 parent 514d443 commit 1d3f1f0

File tree

1 file changed

+20
-19
lines changed

1 file changed

+20
-19
lines changed
 

‎src/core/geometry/qgsgeometryutils.cpp

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -248,30 +248,31 @@ double QgsGeometryUtils::sqrDistance2D( const QgsPointV2& pt1, const QgsPointV2&
248248

249249
double QgsGeometryUtils::sqrDistToLine( double ptX, double ptY, double x1, double y1, double x2, double y2, double& minDistX, double& minDistY, double epsilon )
250250
{
251-
//normal vector
252-
double nx = y2 - y1;
253-
double ny = -( x2 - x1 );
251+
minDistX = x1;
252+
minDistY = y1;
254253

255-
double t;
256-
t = ( ptX * ny - ptY * nx - x1 * ny + y1 * nx ) / (( x2 - x1 ) * ny - ( y2 - y1 ) * nx );
254+
double dx = x2 - x1;
255+
double dy = y2 - y1;
257256

258-
if ( t < 0.0 )
257+
if ( !qgsDoubleNear( dx, 0.0 ) || !qgsDoubleNear( dy, 0.0 ) )
259258
{
260-
minDistX = x1;
261-
minDistY = y1;
262-
}
263-
else if ( t > 1.0 )
264-
{
265-
minDistX = x2;
266-
minDistY = y2;
267-
}
268-
else
269-
{
270-
minDistX = x1 + t * ( x2 - x1 );
271-
minDistY = y1 + t * ( y2 - y1 );
259+
double t = (( ptX - x1 ) * dx + ( ptY - y1 ) * dy ) / ( dx * dx + dy * dy );
260+
if ( t > 1 )
261+
{
262+
minDistX = x2;
263+
minDistY = y2;
264+
}
265+
else if ( t > 0 )
266+
{
267+
minDistX += dx * t ;
268+
minDistY += dy * t ;
269+
}
272270
}
273271

274-
double dist = ( minDistX - ptX ) * ( minDistX - ptX ) + ( minDistY - ptY ) * ( minDistY - ptY );
272+
dx = ptX - minDistX;
273+
dy = ptY - minDistY;
274+
275+
double dist = dx * dx + dy * dy;
275276

276277
//prevent rounding errors if the point is directly on the segment
277278
if ( qgsDoubleNear( dist, 0.0, epsilon ) )

0 commit comments

Comments
 (0)
Please sign in to comment.