Encuentra las nuevas coordenadas usando un punto de partida, una distancia y un ángulo

12

Bien, digamos que tengo un punto coordinado.

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

Ahora también tengo una distancia y un ángulo.

var distance = 20;
var angle = 72;

El problema que estoy tratando de resolver es, si quiero viajar 20 puntos en la dirección del ángulo desde la coordenada inicial, ¿cómo puedo encontrar cuáles serán mis nuevas coordenadas?

Sé que la respuesta involucra cosas como seno / coseno, porque solía saber cómo hacer esto, pero desde entonces he olvidado la fórmula. ¿Alguien puede ayudar?

dqhendricks
fuente
1
72 grados de qué? ¿El eje X, el eje Y? ¿Algo más? ¿En sentido horario, en sentido antihorario?
pdr
@pdr 90 grados serían una dirección del norte, 45 grados serían una dirección de norte al este, etc.
dqhendricks

Respuestas:

5

SOHCAHTOA

Seno = Opuesto / Hipotenusa Coseno = Adyacente / Hipotenusa Tangente = Opuesto / Adyacente

En tu ejemplo:

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

El problema es que debes tener cuidado con el cuadrante en el que te encuentras. Esto funciona perfectamente en el cuadrante superior derecho, pero no tan bueno en los otros tres cuadrantes.

Dave Nay
fuente
1
Esto funciona en todos los cuadrantes. La fórmula completa para rotar un vector (X, Y) es X '= X * sin (ángulo) + Y * cos (ángulo) e Y' = X * sin (ángulo) + Y * -cos (Ángulo). Esto se simplifica a lo que tienes arriba cuando solo giras desde el eje x (1,0).
Chewy Gumball
Hmmm ... ¿qué transformación estoy recordando que tiene un problema con los cuadrantes?
Dave Nay
2
Tenga en cuenta que en javascript, Math.siny similares, toma entrada en radianes, por lo que deberá convertir:radians = (degrees * (Math.PI/180)
Brian
1
@DaveNay tienes problemas al hacer las funciones de Arc. Sin (45 grados) = Sin (135 grados) por lo tanto, arcsin (sin (135 grados)) devolverá 45 grados; Cos (45) = Cos (315) ...
mhoran_psprep
2

Solo para grabar una adaptación de JavaScript de 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
fuente