Encontre as novas coordenadas usando um ponto de partida, uma distância e um ângulo


12

Ok, diga que tenho uma coordenada de ponto.

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

Agora eu também tenho uma distância e um ângulo.

var distance = 20;
var angle = 72;

O problema que estou tentando resolver é que, se eu quiser percorrer 20 pontos na direção do ângulo a partir da coordenada inicial, como posso encontrar quais serão minhas novas coordenadas?

Eu sei que a resposta envolve coisas como seno / cosseno, porque eu sabia como fazer isso, mas desde então esqueci a fórmula. Alguém pode ajudar?


1
72 graus de quê? O eixo X, o eixo Y? Algo mais? No sentido horário, anti-horário?
Pd

@pdr 90 graus seria uma direcção do norte, 45 graus seria uma direcção de nordeste, etc
dqhendricks

Respostas:


5

SOHCAHTOA

Seno = Oposto / Hipotenusa Cosseno = Adjacente / Hipotenusa Tangente = Oposto / Adjacente

No seu exemplo:

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

O problema é que você deve ter cuidado com o quadrante em que está. Isso funciona perfeitamente no quadrante superior direito, mas não é tão agradável nos outros três quadrantes.


1
Isso funciona em todos os quadrantes. A fórmula completa para girar um vetor (X, Y) é X '= X * sin (ângulo) + Y * cos (ângulo) e Y' = X * sin (ângulo) + Y * -cos (ângulo). Isso simplifica o que você tem acima quando apenas gira do eixo x (1,0).
perfil completo de Gumball

Hmmm ... que transformação estou lembrando que tem uma pegada em relação aos quadrantes?
Dave Nay

2
Observe que em javascript, Math.sine assim por diante, são inseridos em radianos, portanto você precisará converter:radians = (degrees * (Math.PI/180)
Brian

1
@DaveNay você tem problemas ao executar as funções do Arc. Sin (45degrees) = Sin (135degrees), portanto, arcsin (sin (135degrees)) retornará 45degrees; Cos (45) = cos (315) ...
mhoran_psprep

2

Apenas para gravar uma adaptação em javascript dos 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; }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.