Code archives/Algorithms/Distance to line

This code has been declared by its author to be Public Domain code.

Download source code

Distance to line by Otus2007
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