Author Topic: 2 вектора из одной точки. Как расчитать угол больше 180 градусов?  (Read 2009 times)

0 Members and 1 Guest are viewing this topic.

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Координатная сетка слева на право от -х до +х. С верху вниз от -y до +y.
Формула вычисляющая угол между векторами не позволяет получить угол больше 180 градусов.
Потому что cos(270)=x существует, а arccos(х)=270 не существует.

Code: (clickermann) [Select]
     
//Axy - координаты начальной точки перса
//Bxy - координаты конечной точки куда надо прийти
//Cxу - координаты случайной точки куда прибежит перс за 1 сек
//Формула вычисляющая угол между векторами
$_ABx = $_Bx - $_Ax
$_ABy = $_By - $_Ay
$_ACx = $_Cx - $_Ax
$_ACy = $_Cy - $_Ay
$_ABAC =  $_ABx*$_ACx+$_ABy*$_ACy
$_ABAC2=(SQRT(($_ABx*$_ABx)+($_ABy*$_ABy)))*(SQRT(($_ACx*$_ACx)+($_ACy*$_ACy)))
$_ugol = ARCCOS($_ABAC/$_ABAC2)  //всегда от 0 до 180 градусов
« Last Edit: January 18, 2018, 09:52:44 PM by ya12 »

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Я считал азимуты двух векторов и потом их разницу.
Координаты экранные

Code: (clickermann) [Select]
//===  Вычисляем азимут  =======================================================
SUB(azimut, $tx1,$ty1,$tx2,$ty2) //=============================================
   $azimuth =  ARCcos((-1)*($ty2-$ty1)/Sqrt(POW(($tx2-$tx1),2)+POW(($ty2-$ty1),2)))
   IF($tx2 < $tx1)
      $azimuth =  360 - $azimuth
   END_IF
   $azimuth = int($azimuth)
   LOGWRITE ("Азимут = ", $azimuth)
END_SUB


ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Спасибо. Я наконец выспался и прозрел, что ищу не тот угол и для чего нужен азимут.

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
На просторах интернета нашел более изящную идею.

Определяется так. Предположим, у нас есть 3 точки: А(х1,у1), Б(х2,у2), С(х3,у3). Через точки А и Б проведена прямая. И нам надо определить, как расположена точка С относительно прямой АБ. Для этого вычисляем значение:
D = (х3 - х1) * (у2 - у1) - (у3 - у1) * (х2 - х1)
- Если D = 0 - значит, точка С лежит на прямой АБ.
- Если D < 0 - значит, точка С лежит слева от прямой.
- Если D > 0 - значит, точка С лежит справа от прямой.

Взято здесь:
Готовая формула - http://www.cyberforum.ru/delphi-beginners/thread652199.html
Теоретическое обоснование - https://habrahabr.ru/post/148325/