Trova le nuove coordinate usando un punto di partenza, una distanza e un angolo


12

Va bene, dire che ho una coordinata punto.

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

Ora ho anche una distanza e un angolo.

var distance = 20;
var angle = 72;

Il problema che sto cercando di risolvere è, se voglio percorrere 20 punti nella direzione dell'angolo dalla coordinata iniziale, come posso trovare quali saranno le mie nuove coordinate?

So che la risposta coinvolge cose come seno / coseno, perché sapevo come farlo, ma da allora ho dimenticato la formula. Qualcuno può aiutare?


1
72 gradi da cosa? L'asse X, l'asse Y? Qualcos'altro? In senso orario, antiorario?
pdr

@pdr 90 gradi sarebbe una direzione del nord, 45 gradi sarebbe una direzione del nord est, ecc.
dqhendricks,

Risposte:


5

Sohcahtoa

Seno = opposto / ipotenusa Coseno = adiacente / ipotenusa Tangente = opposto / adiacente

Nel tuo esempio:

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

Il problema è che devi stare attento a quale quadrante ti trovi. Funziona perfettamente nel quadrante in alto a destra, ma non è così carino negli altri tre quadranti.


1
Funziona in tutti i quadranti. La formula completa per ruotare un vettore (X, Y) è X '= X * sin (angolo) + Y * cos (angolo) e Y' = X * sin (angolo) + Y * -cos (Angolo). Questo semplifica ciò che hai sopra quando ruoti dall'asse x (1,0).
Chewy Gumball,

Hmmm ... quale trasformazione sto ricordando che ha un gotcha per quanto riguarda i quadranti?
Dave Nay,

2
Nota che in javascript Math.sine simili accetta input in radianti, quindi dovrai convertire:radians = (degrees * (Math.PI/180)
Brian

1
@DaveNay hai problemi quando esegui le funzioni Arc. Sin (45 gradi) = Sin (135 gradi) quindi arcsin (peccato (135 gradi)) restituirà 45 gradi; Cos (45) = Cos (315) ...
mhoran_psprep,

2

Solo per registrare un adattamento javascript da Script di tipo mobile

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; }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.