из старой pascal'евской игрушки:
function DistToBar(x1, y1, x2, y2, x0, y0 : Integer) : Boolean;
{находится ли точка (x0,y0) в прямоугольнике (x1,y1)-(x2,y2)}
Var
dx, dy : Integer;
Begin
dx := abs(x2-x1);
dy := abs(y2-y1);
if dx < 15 then dx := 15;
if dy < 15 then dy := 15;
DistToBar := (abs(x1-x0) <= dx) and (abs(x2-x0) <= dx)
and (abs(y1-y0) <= dy) and (abs(y2-y0) <= dy);
End;
function DistToLine(x1, y1, x2, y2, x0, y0, maxDist : Integer) : Boolean;
{расстояние от точки (x0,y0) до отрезка (x1,y1, x2,y2)}
Var
A, B, C : LongInt;
dist : Real;
Begin
x1 := x1 - x0;
y1 := y1 - y0;
x2 := x2 - x0;
y2 := y2 - y0;
x0 := 0; {?}
y0 := 0; {?}
A := y1 - y2;
B := x2 - x1;
C := LongInt(y2)*x1 - LongInt(y1)*x2;
dist := Sqrt(A*A + B*B);
if dist <> 0 then dist := abs(A*x0{?=0} + B*y0{?=0} + C) / dist;
DistToLine := (dist <= maxDist);
End;
Function OnLine(x0, y0, dist, x1, y1, x2, y2 : Integer) : Boolean;
{проверка на пересечение линии на карте}
Begin
OnLine := DistToBar(x1, y1, x2, y2, x0, y0)
and DistToLine(x1, y1, x2, y2, x0, y0, dist);
End;