Как найти расстояние от точки до отрезка?

Заданы координаты точки (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;

            }

        }
    }
}

Итоговый полностью работающий код, на случай если кому то понадобится

→ Ссылка