Метод возвращает неправильно расстояние от отрезка до точки - C#
Формулировка задачи:
В частности при A(-30;0), B(30;0), K(60;30) правильный ответ 42,4264068711929. Я вычисляю, с расчерчивание в тетради и получается 30. Ошибка в правильном ответе исключена, что-то в формулах
P.S. статьи на хабре прочитал по выч. геометрии. Вроде все формулы вписал. Но выдает неправильный ответ. Правильные ответы известны заранее
Листинг программы
- 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 ak = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
- double kb = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
- double ab = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
- //скалярное произведение векторов
- double mulScalarAKAB = (x - ax) * (bx - ax) + (y - ay) * (by - ay);
- double mulScalarBKAB = (x - bx) * (bx - ax) + (y - by) * (by - ay);
- if (ab == 0) return ak;
- else if (mulScalarAKAB >= 0 || mulScalarBKAB >= 0)
- {
- double p = (ak + kb + ab) / 2.0;
- double s = Math.Sqrt(Math.Abs((p * (p - ak) * (p - kb) * (p - ab))));
- return (2.0 * s) / ab;
- }
- else if (mulScalarAKAB < 0 || mulScalarBKAB < 0)
- {
- return Math.Min(ak, kb);
- }
- else return 0;
- }
- }
Решение задачи: «Метод возвращает неправильно расстояние от отрезка до точки»
textual
Листинг программы
- // Расстояние от точки (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 ak = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
- double kb = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
- double ab = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
- //скалярное произведение векторов
- double mulScalarAKAB = (x - ax) * (bx - ax) + (y - ay) * (by - ay);
- double mulScalarBKAB = (x - bx) * (-bx + ax) + (y - by) * (-by + ay);
- if (ab == 0) return ak;
- else if (mulScalarAKAB >= 0 && mulScalarBKAB >= 0)
- {
- double p = (ak + kb + ab) / 2.0;
- double s = Math.Sqrt(Math.Abs((p * (p - ak) * (p - kb) * (p - ab))));
- return (2.0 * s) / ab;
- }
- else if (mulScalarAKAB < 0 || mulScalarBKAB < 0)
- {
- return Math.Min(ak, kb);
- }
- else return 0;
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д