Ответ 1
Трудно дать простой ответ на этот вопрос, потому что многое зависит от фактического графического представления. Например, в каком направлении вы указываете, где rotate(0deg)
.
Я могу объяснить найденную формулу, которая может помочь вам устранить проблему самостоятельно. Жесткая часть:
var dLon = (lng2 - lng1);
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(dLon);
var rad = Math.atan2(y, x);
Здесь вы видите формулу Хаверсинеса (https://en.wikipedia.org/wiki/Haversine_formula). Обычно может быть достаточно двух наборов координат и вычислить угол между ними. При работе с широтой и долготой это не сработает, потому что земля не плоская. Первые три строки - Haversine, а результат (x
и y
) - это координаты на unit circle
(https://en.wikipedia.org/wiki/Unit_circle)
Следующий шаг - рассчитать угол от точки на этом единичном круге до центра. Для этого мы можем использовать arctangant
. Javascript имеет вспомогательную функцию atan2
, которая упрощает этот процесс. В результате просто угол вашей точки к центру круга. Другими словами, ваша позиция по отношению к вашей точке интереса. Результат получается в радианах и должен быть преобразован в градусы. (https://en.wikipedia.org/wiki/Atan2)
Упрощенная версия с плоской системой координат будет выглядеть так:
var deltaX = poi.x - you.x;
var deltaY = you.y - poi.y;
var rotation = toDeg(Math.atan2(deltaX, deltaY));
bearingElement.css('transform', 'rotate(' + rotation + 'deg)');
Где poi
- Точка интереса, а you
- ваша позиция.
Чтобы компенсировать свое собственное вращение, вам нужно вычитать свое собственное вращение. В приведенном выше примере результат будет выглядеть следующим образом:
var deltaX = poi.x - you.x;
var deltaY = you.y - poi.y;
var rotation = toDeg(Math.atan2(deltaX, deltaY));
rotation -= you.rotation;
bearingElement.css('transform', 'rotate(' + rotation + 'deg)');
Я сделал Plunckr, в котором вы можете увидеть простую плоскую систему координат. Вы можете перемещать и поворачивать you
и point of interest
. Стрелка внутри "вы" всегда будет указывать на poi
, даже если вы вращаете "вы". Это потому, что мы компенсируем нашу собственную ротацию.
https://plnkr.co/edit/OJBGWsdcWp3nAkPk4lpC?p=preview
Обратите внимание на Plunckr, что "нулевое" положение всегда находится на севере. Проверьте свое приложение, чтобы увидеть свою нулевую позицию. Отрегулируйте его, и ваш script будет работать.
Надеюсь, что это поможет: -)