Функция для нахождения минимального расстояния от точки до отрезка по координатам.
Аргументы функции:
$x
, $y
- координаты точки C.
$x1
, $y1
, $x2
, $y2
- координаты двух точек, они описывают отрезок AB.
function distancePointToLine($x, $y, $x1, $y1, $x2, $y2)
{
$A = $x - $x1;
$B = $y - $y1;
$C = $x2 - $x1;
$D = $y2 - $y1;
$dot = $A * $C + $B * $D;
$len_sq = $C * $C + $D * $D;
$param = -1;
if ($len_sq != 0) {
$param = $dot / $len_sq;
}
$xx = $yy = 0;
if ($param < 0) {
$xx = $x1;
$yy = $y1;
} else if ($param > 1) {
$xx = $x2;
$yy = $y2;
} else {
$xx = $x1 + $param * $C;
$yy = $y1 + $param * $D;
}
$dx = $x - $xx;
$dy = $y - $yy;
return array('x' => $xx, 'y' => $yy, 'd' => sqrt($dx * $dx + $dy * $dy));
}
В результате получится массив:
x
, y
– координаты пересечения на отрезке AB.
d
– расстояние от точки С до отрезка.
function distancePointToLine(x, y, x1, y1, x2, y2)
{
A = x - x1;
B = y - y1;
C = x2 - x1;
D = y2 - y1;
dot = A * C + B * D;
len_sq = C * C + D * D;
param = -1;
if (len_sq != 0) {
param = dot / len_sq;
}
xx = yy = 0;
if (param < 0) {
xx = x1;
yy = y1;
} else if (param > 1) {
xx = x2;
yy = y2;
} else {
xx = x1 + param * C;
yy = y1 + param * D;
}
dx = x - xx;
dy = y - yy;
return {x: xx, y: yy, d: Math.sqrt(dx * dx + dy * dy)};
}