[bmx] Distance to line by Otus [ 1+ years ago ]

Started by BlitzBot, June 29, 2017, 00:28:38

Previous topic - Next topic

BlitzBot

Title : Distance to line
Author : Otus
Posted : 1+ years ago

Description : I think this code is quite optimized.

The c code is a bit faster.


Code :
Code (blitzmax) Select
Function DistanceToLineSegment:Double(ax:Double,ay:Double,..
bx:Double,by:Double, px:Double,py:Double)
'Returns the distance from p to
' the closest point on line segment a-b.

Local dx:Double=bx-ax
Local dy:Double=by-ay

Local t:Double =  ( (py-ay)*dy + (px-ax)*dx ) / (dy*dy + dx*dx)

If t<0
dx=ax
dy=ay
ElseIf t>1
dx=bx
dy=by
Else
dx = ax+t*dx
dy = ay+t*dy
End If

dx:-px
dy:-py

Return Sqr(dx*dx + dy*dy)

End Function

Function DistanceToLine:Double(ax:Double,ay:Double, bx:Double,by:Double, px:Double,py:Double)
'Returns the distance from p to the closest point
' ont the line passing through a and b.

Local dx:Double=bx-ax
Local dy:Double=by-ay

Return ( (ay-py)*dx + (px-ax)*dy ) / Sqr(dy*dy + dx*dx)

End Function

'in.c:

double dx;
double dy;
double t;

double DistanceToLineSegment(double ax, double ay, double bx, double by, double px, double py)
{
dx = bx-ax;
dy = by-ay;

t = ( (py-ay)*dy + (px-ax)*dx ) / (dy*dy + dx*dx);

if (t<0) {
ax-=px;
ay-=py;
return sqrt(ax*ax + ay*ay);
}
if (t>1) {
bx-=px;
by-=py;
return sqrt(bx*bx + by*by);
}

ax+=t*dx-px;
ay+=t*dy-py;
return sqrt(ax*ax + ay*ay);
}

double DistanceToLine(double ax, double ay, double bx, double by, double px, double py)
{
dx = bx-ax;
dy = by-ay;

return ( (ay-py)*dx + (px-ax)*dy ) / sqrt(dy*dy + dx*dx);
}


Comments : none...