Найти новые координаты, используя начальную точку, расстояние и угол


12

Хорошо, скажи, что у меня есть точечная координата.

var coordinate = { x: 10, y: 20 };

Теперь у меня тоже есть расстояние и угол.

var distance = 20;
var angle = 72;

Проблема, которую я пытаюсь решить, заключается в том, что если я хочу переместиться на 20 точек в направлении угла от начальной координаты, как мне найти мои новые координаты?

Я знаю, что ответ включает в себя такие вещи, как синус / косинус, потому что я знал, как это сделать, но с тех пор я забыл формулу. Кто-нибудь может помочь?


1
72 градуса от чего? Ось X, ось Y? Что-то другое? По часовой стрелке, против часовой стрелки?
фунтовые

@pdr 90 градусов - направление на север, 45 градусов - направление на северо-восток и т. д.
dqhendricks 14.12.12

Ответы:


5

SOHCAHTOA

Синус = Противоположный / Гипотенуза Косинус = Соседний / Касательный гипотенузы = Противоположный / Соседний

В вашем примере:

Sine(72) = Y/20 -> Y = Sine(72) * 20
Cosine(72) = X/20 -> X = Cosine(72) *20

Проблема в том, что вы должны быть осторожны с тем, в каком квадранте вы находитесь. Это прекрасно работает в верхнем правом квадранте, но не так хорошо в остальных трех квадрантах.


1
Это работает во всех секторах. Полная формула для вращения вектора (X, Y): X '= X * sin (угол) + Y * cos (угол) и Y' = X * sin (угол) + Y * -cos (угол). Это упрощает то, что вы имеете выше, когда просто вращаетесь от оси х (1,0).
Chewy Gumball

Хммм ... какая трансформация, я помню, у которой есть недочеты в отношении квадрантов?
Дейв Най

2
Обратите внимание, что в javascript Math.sinи т. П. Вводятся данные в радианах, поэтому вам необходимо преобразовать:radians = (degrees * (Math.PI/180)
Брайан

1
@DaveNay у вас проблемы при выполнении функций Arc. Sin (45 градусов) = Sin (135 градусов), поэтому arcsin (sin (135 градусов)) вернет 45 градусов; Cos (45) = Cos (315) ...
mhoran_psprep 14.12.12

2

Просто чтобы записать адаптацию javascript из сценариев подвижного типа

function createCoord(coord, bearing, distance){
    /** http://www.movable-type.co.uk/scripts/latlong.html
     φ is latitude, λ is longitude, 
     θ is the bearing (clockwise from north), 
     δ is the angular distance d/R; 
     d being the distance travelled, R the earth’s radius*
     **/

    var 
        radius = 6371e3, //meters
        δ = Number(distance) / radius, // angular distance in radians
        θ = Number(bearing).toRad();
        φ1 = coord[1].toRad(),
        λ1 = coord[0].toRad();

    var φ2 = Math.asin(Math.sin1)*Math.cos(δ) + Math.cos1)*Math.sin(δ)*Math.cos(θ));

    var λ2 = λ1 + Math.atan2(Math.sin(θ)*Math.sin(δ)*Math.cos1), Math.cos(δ)-Math.sin1)*Math.sin2));

    λ2 = 2+3*Math.PI) % (2*Math.PI) - Math.PI; // normalise to -180..+180°

    return 2.toDeg(), φ2.toDeg()]; //[lon, lat]
}

Number.prototype.toDeg = function() { return this * 180 / Math.PI; }
Number.prototype.toRad = function() { return this * Math.PI / 180; }
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.