Метод возвращает неправильно расстояние от отрезка до точки - C#

Узнай цену своей работы

Формулировка задачи:

В частности при A(-30;0), B(30;0), K(60;30) правильный ответ 42,4264068711929. Я вычисляю, с расчерчивание в тетради и получается 30. Ошибка в правильном ответе исключена, что-то в формулах P.S. статьи на хабре прочитал по выч. геометрии. Вроде все формулы вписал. Но выдает неправильный ответ. Правильные ответы известны заранее
Листинг программы
  1. public static class DistanceTask
  2. {
  3. // Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
  4. public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
  5. {
  6. double ak = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
  7. double kb = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
  8. double ab = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
  9. //скалярное произведение векторов
  10. double mulScalarAKAB = (x - ax) * (bx - ax) + (y - ay) * (by - ay);
  11. double mulScalarBKAB = (x - bx) * (bx - ax) + (y - by) * (by - ay);
  12.  
  13. if (ab == 0) return ak;
  14. else if (mulScalarAKAB >= 0 || mulScalarBKAB >= 0)
  15. {
  16. double p = (ak + kb + ab) / 2.0;
  17. double s = Math.Sqrt(Math.Abs((p * (p - ak) * (p - kb) * (p - ab))));
  18. return (2.0 * s) / ab;
  19. }
  20. else if (mulScalarAKAB < 0 || mulScalarBKAB < 0)
  21. {
  22. return Math.Min(ak, kb);
  23. }
  24. else return 0;
  25. }
  26. }

Решение задачи: «Метод возвращает неправильно расстояние от отрезка до точки»

textual
Листинг программы
  1. // Расстояние от точки (x, y) до отрезка AB с координатами A(ax, ay), B(bx, by)
  2. public static double GetDistanceToSegment(double ax, double ay, double bx, double by, double x, double y)
  3. {
  4.     double ak = Math.Sqrt((x - ax) * (x - ax) + (y - ay) * (y - ay));
  5.     double kb = Math.Sqrt((x - bx) * (x - bx) + (y - by) * (y - by));
  6.     double ab = Math.Sqrt((ax - bx) * (ax - bx) + (ay - by) * (ay - by));
  7.  
  8.     //скалярное произведение векторов
  9.     double mulScalarAKAB = (x - ax) * (bx - ax) + (y - ay) * (by - ay);
  10.     double mulScalarBKAB = (x - bx) * (-bx + ax) + (y - by) * (-by + ay);
  11.  
  12.  
  13.     if (ab == 0) return ak;
  14.  
  15.     else if (mulScalarAKAB >= 0 && mulScalarBKAB >= 0)
  16.     {
  17.  
  18.         double p = (ak + kb + ab) / 2.0;
  19.         double s = Math.Sqrt(Math.Abs((p * (p - ak) * (p - kb) * (p - ab))));
  20.  
  21.         return (2.0 * s) / ab;
  22.     }
  23.  
  24.     else if (mulScalarAKAB < 0 || mulScalarBKAB < 0)
  25.     {
  26.         return Math.Min(ak, kb);
  27.     }
  28.  
  29.     else return 0;
  30.  
  31. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы