Znajdź nowe współrzędne, używając punktu początkowego, odległości i kąta

12

Okej, powiedz, że mam współrzędną punktu.

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

Teraz mam także odległość i kąt.

var distance = 20;
var angle = 72;

Problem, który próbuję rozwiązać, jeśli chcę przesunąć 20 punktów w kierunku kąta od współrzędnej początkowej, jak mogę znaleźć moje nowe współrzędne?

Wiem, że odpowiedź dotyczy rzeczy takich jak sinus / cosinus, ponieważ kiedyś wiedziałem, jak to zrobić, ale od tego czasu zapomniałem o formule. Czy ktoś może pomóc?

dqhendricks
źródło
1
72 stopnie od czego? Oś X, oś Y? Coś innego? Zgodnie z ruchem wskazówek zegara, czy przeciwnie do ruchu wskazówek zegara?
pdr
@pdr 90 stopni byłoby kierunkiem północnym, 45 stopni byłoby kierunkiem północno-wschodnim itp.
dqhendricks 14.12.12

Odpowiedzi:

5

SOHCAHTOA

Sinus = przeciwny / przeciwprostokątny Cosinus = przyległy / stonowany przeciwprostokątny = przeciwny / przylegający

W twoim przykładzie:

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

Problem polega na tym, że musisz uważać na to, w jakiej ćwiartce się znajdujesz. Działa to doskonale w prawym górnym kwadrancie, ale nie tak ładnie w pozostałych trzech ćwiartkach.

Dave Nay
źródło
1
Działa to we wszystkich kwadrantach. Pełna formuła obracania wektora (X, Y) to X '= X * sin (kąt) + Y * cos (kąt) i Y' = X * sin (kąt) + Y * -cos (kąt). Upraszcza to to, co masz powyżej, gdy tylko obracasz się z osi x (1,0).
Chewy Gumball,
Hmmm ... jaką transformację pamiętam, która ma problem z kwadrantami?
Dave Nay
2
Zauważ, że w javascript Math.sini tym podobne pobiera dane w radianach, więc będziesz musiał przekonwertować:radians = (degrees * (Math.PI/180)
Brian,
1
@DaveNie masz problemów podczas wykonywania funkcji Arc. Sin (45 stopni) = Sin (135 stopni), dlatego arcsin (sin (135 stopni)) zwróci 45 stopni; Cos (45) = Cos (315) ...
mhoran_psprep
2

Wystarczy nagrać adaptację javascript z Movable Type Scripts

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; }
Jonatas Walker
źródło