Задать вопрос
light2041
@light2041
web-разработчик

Как посчитать угол по 2-м координатам?

Добрый день! У меня не получается решить небольшую математическую задачку, поэтому прошу помощи сообщества.

Итак, у меня есть сервис отслеживания транспорта. Для каждой машины на карте нужно установить угол поворота через transform: rotate(<угол>).

Для каждой машины у меня есть ее прошлая координата X1, Y1 и текущая координата X2, Y2.

Вопрос. Какая формула позволит высчитывать этот угол?
  • Вопрос задан
  • 16410 просмотров
Подписаться 1 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 7
alpha = arccos (deltaX / deltaY)
PS а "высшая математика" в тэгах к вопросу - это маркетинг? :)

UPD: ойблин, пардон... все учителя математики моей юности, простите меня :/

конечно же alpha = atan ( deltaY / deltaX )
ну а при deltaX=0, alpha = sign(deltaY) * pi/2;
Ответ написан
GavriKos
@GavriKos
Нарисуйте это на бумажке - и поймете. По сути у вас есть прямоугольный треугольник, где гипотенуза - отрезок от (x1,y1) до (x2,y2), а катеты - проекции на соответствующие оси. Далее нужный угол находите из формул соотношения углов и сторон прямоугольного треугольника.
Ответ написан
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Итак, у меня есть сервис отслеживания транспорта.
У меня не получается решить небольшую математическую задачку,
Сдайте дидактический материал и идите учить уроки!
X = x0 + (x - x0) * cos(a) - (y - y0) * sin(a);
Y = y0 + (y - y0) * cos(a) + (x - x0) * sin(a);
Ответ написан
Комментировать
@abcd0x00
Здесь про угол между векторами
угол(a, b) = arccos((a * b) / (|a| * |b|))
a * b - скалярное произведение (сумма произведений координат)
|a| - длина вектора (корень из суммы квадратов его координат)
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Как я понял, вам нужен угол вектора (x1,y1)→(x2,y2).
Любой школьный «арк», если им действовать в лоб, в определённом диапазоне углов не определён или неустойчив.
Но именно для этого в большинстве языков присутствует функция
atan2(y2 - y1, x2 - x1)
Ответ написан
Комментировать
evgenyspace
@evgenyspace
Исследователь
Если задача звучит именно так, то она сводится к нахождению угла между векторами (см. скалярное произведение векторов):

const getScalarProduct = ([xA, ...restA], [xB, ...restB]) => 
   (restA.length === 0 || restB.length === 0)
      ? xA * xB
      : xA * xB + getScalarProduct(restA, restB)
  
const getSquareModule = ([x, ...rest]) =>
   (rest.length === 0)
      ? x * x
      : x * x + getSquareModule(rest)

const getModule = (A) => Math.sqrt(getSquareModule(A))
  
const getCosOfAngle = (A, B) => getScalarProduct(A, B) / (getModule(A) * getModule(B))


getCosOfAngle([1, 0],[0, 1]) - двумерный случай, но можно находить угол для любой размерности

P.S.: код на JavaScript, функция getCosOfAngle возвращает косинус угла
Ответ написан
Комментировать
assasinsarni
@assasinsarni
Никогда не поздно, возможные исключения за тобой.

<?php 
	$x1 = 10;
	$y1 = 10;
	$x2 = 5;
	$y2 = 5;

	$alpha = rad2deg(atan2($y1 > $y2 ? $y1 - $y2 : ($y1 == $y2 ? $y1 : $y2 - $y1), $x1 > $x2 ? $x1 - $x2 : ($x1 == $x2 ? $x1 : $x2 - $x1)));

	echo($alpha)
?>


UPD: В этом решении можно получить угол, если координаты по отдаленности будут меняться между собой, решение будет правильным.

UPD2: Пример, если это по-типу радара и углы 0 - 180 и 0 - -180:
$alpha = (($y1 > $y2 ? 180 : -180) - rad2deg(atan2($y1 - $y2, $x1 - $x2))) * -1;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы