Знайдіть нові координати, використовуючи початкову точку, відстань та кут


12

Гаразд, скажіть, у мене крапка координат.

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

Тепер у мене також є відстань і кут.

var distance = 20;
var angle = 72;

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

Я знаю, що відповідь включає такі речі, як синус / косинус, тому що я раніше знав, як це зробити, але з тих пір я забув формулу. Хтось може допомогти?


1
72 градуси від чого? Вісь X, вісь Y? Щось ще? За годинниковою стрілкою, проти годинникової стрілки?
пдр

@pdr 90 градусів було б напрямом на північ, 45 градусів - напрям на північний схід тощо.
dqhendricks

Відповіді:


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 (кут). Це спрощує те, що у вас є вище, лише обертаючись від осі x (1,0).
Chewy Gumball

Гммм ... про яку трансформацію я пам’ятаю, що має суть щодо квадрантів?
Дейв Най

2
Зауважте, що у javascript Math.sinі тому подібному використовується введення в радіанах, тому вам потрібно буде конвертувати:radians = (degrees * (Math.PI/180)
Брайан

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

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.