Как найти расстояние от точки до отрезка?
Заданы координаты точки (x, y), задан отрезок A(ax, ay) B(bx, by). Надо найти между ними расстояние. Смог сделать проверку принажледности точки к отрезку. Код:
using System;
namespace DistanceTask
{
public static class DistanceTask
{
// Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
{
// лежит ли на отрезке
if ((Math.Min(ax, bx) <= x && x <= Math.Max(ax, bx)) && (Math.Min(ay, by) <= y && y <= Math.Max(ay, by)))
return 0;
}
}
}
Пробовал сделать решение с помощью ответа на другой вопрос
value = ((x - ax) * (bx - ax) + (y - ay) * (by - ay)) / (Math.Pow(bx - ax, 2) + Math.Pow(by - ay, 2));
if (value < 0)
value = 0;
else if (value > 1)
value = 1;
else
value = 0;
result = Math.Sqrt(Math.Pow(ax - x + (bx - ax) * value, 2) + Math.Pow(ay - y + (by - ay) * value, 2));
return result;
но при проверке на некоторых тестах в зависимости от разсположения точки выдает не верно
Ответы (2 шт):
Автор решения: MBo
→ Ссылка
уберите
else
value = 0;
и должно заработать
Тест на питоне
import math
def dist(ax, ay, bx, by, x, y):
value = ((x - ax) * (bx - ax) + (y - ay) * (by - ay)) / ((bx - ax)**2 + (by - ay)**2)
if (value < 0):
value = 0
elif (value > 1):
value = 1
return math.hypot(ax - x + (bx - ax) * value, ay - y + (by - ay) * value)
print(dist(-30, 0, 30, 0, 0,-30))
print(dist(-15, -25.98076, 15, 25.98076,-25.98076, 15))
30.0
29.99999816962661
Автор решения: funny110
→ Ссылка
using System;
using System.Windows.Forms;
namespace DistanceTask
{
public static class DistanceTask
{
// Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
{
double value, result;
// лежит ли на точка на отрезке
if ((Math.Min(ax, bx) <= x && x <= Math.Max(ax, bx)) && (Math.Min(ay, by) <= y && y <= Math.Max(ay, by)))
return 0;
// является ли отрезок точкой
else if (ax == bx && ay == by)
{
result = Math.Sqrt(Math.Pow(bx - x, 2) + Math.Pow(by - y, 2));
return result;
}
// разчет расстояния между точкой и отрезком
else
{
value = ((x - ax) * (bx - ax) + (y - ay) * (by - ay)) / (Math.Pow(bx - ax, 2) + Math.Pow(by - ay, 2));
if (value < 0)
value = 0;
if (value > 1)
value = 1;
result = Math.Sqrt(Math.Pow(ax - x + (bx - ax) * value, 2) + Math.Pow(ay - y + (by - ay) * value, 2));
return result;
}
}
}
}
Итоговый полностью работающий код, на случай если кому то понадобится