Code archives/Algorithms/Distance to line
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
I think this code is quite optimized. The c code is a bit faster. | |||||
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.
Code Archives Forum