Trouvez les nouvelles coordonnées en utilisant un point de départ, une distance et un angle

12

D'accord, disons que j'ai une coordonnée ponctuelle.

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

Maintenant, j'ai aussi une distance et un angle.

var distance = 20;
var angle = 72;

Le problème que j'essaie de résoudre est, si je veux parcourir 20 points dans le sens de l'angle par rapport à la coordonnée de départ, comment puis-je trouver quelles seront mes nouvelles coordonnées?

Je sais que la réponse implique des choses comme sinus / cosinus, parce que je savais comment faire, mais j'ai depuis oublié la formule. Quelqu'un peut-il aider?

dqhendricks
la source
1
72 degrés de quoi? L'axe X, l'axe Y? Autre chose? Dans le sens horaire, antihoraire?
pdr
@pdr 90 degrés serait une direction du nord, 45 degrés serait une direction du nord-est, etc.
dqhendricks

Réponses:

5

SOHCAHTOA

Sinus = Opposé / Hypoténuse Cosinus = Adjacent / Hypoténuse Tangent = Opposé / Adjacent

Dans votre exemple:

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

Le problème est que vous devez faire attention au quadrant dans lequel vous vous trouvez. Cela fonctionne parfaitement dans le quadrant supérieur droit, mais pas aussi bien dans les trois autres quadrants.

Dave Nay
la source
1
Cela fonctionne dans tous les quadrants. La formule complète pour faire tourner un vecteur (X, Y) est X '= X * sin (angle) + Y * cos (angle) et Y' = X * sin (angle) + Y * -cos (Angle). Cela se simplifie par rapport à ce que vous avez ci-dessus lorsque vous tournez simplement à partir de l'axe x (1,0).
Chewy Gumball
Hmmm ... quelle transformation me souviens-je qui a un problème avec les quadrants?
Dave Nay
2
Notez qu'en javascript, Math.sinetc., les entrées sont en radians, vous devrez donc convertir:radians = (degrees * (Math.PI/180)
Brian
1
@DaveNay vous rencontrez des problèmes lors de l'exécution des fonctions Arc. Sin (45degrees) = Sin (135degrees) donc arcsin (sin (135degrees)) retournera 45degrees; Cos (45) = Cos (315) ...
mhoran_psprep
2

Juste pour enregistrer une adaptation javascript à partir de scripts de type 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; }
Jonatas Walker
la source