web-dev-qa-db-fra.com

Trouvez les nouvelles coordonnées à l'aide d'un point de départ, d'une distance et d'un angle

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

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 la direction de l'angle de la coordonnée de départ, comment puis-je trouver ce que mes nouvelles coordonnées seront?

Je sais que la réponse implique des choses comme Sine/Cosine, car j'avais l'habitude de savoir comment faire cela, mais j'ai depuis oublié la formule. Quelqu'un peut-il aider?

12
dqhendricks

Sohcahtoa

Sine = opposé/hypoténuse cosine = tangente adjacente/hypoténuse = opposée/adjacente

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 avec quel quadrant vous êtes. Cela fonctionne parfaitement dans le quadrant supérieur droit, mais pas si agréable dans les trois autres quadrants.

5
Dave Nay

Juste pour enregistrer une adaptation JavaScript à partir de Scripts de type mobiles

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.sin(φ1)*Math.cos(δ) + Math.cos(φ1)*Math.sin(δ)*Math.cos(θ));

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

    λ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; }
2
Jonatas Walker