Bir başlangıç ​​noktası, bir mesafe ve bir açı kullanarak yeni koordinatları bulun


12

Tamam, bir nokta koordinatım olduğunu söyle.

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

Şimdi de bir mesafem ve bir açım var.

var distance = 20;
var angle = 72;

Çözmeye çalıştığım sorun, eğer başlangıç ​​koordinatından açı yönünde 20 nokta gitmek istersem, yeni koordinatlarımın ne olacağını nasıl bulabilirim?

Cevabın sinüs / kosinüs gibi şeyleri içerdiğini biliyorum, çünkü bunu nasıl yapacağımı biliyordum, ama o zamandan beri formülü unuttum. Biri yardım edebilir mi?


1
Ne dereceden 72 derece? X ekseni, Y ekseni? Başka bir şey? Saat yönünde, saat yönünün tersine mi?
pdr

@pdr 90 derece kuzey yönü, 45 derece kuzey doğu yönü vb. olacaktır
dqhendricks

Yanıtlar:


5

SOHCAHTOA

Sinüs = Zıt / Hipotenüs Kosinüs = Bitişik / Hipotenüs Teğet = Zıt / Bitişik

Örneğinizde:

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

Sorun şu ki, hangi kadranda olduğunuza dikkat etmeniz gerekiyor. Bu, sağ üst kadranda mükemmel çalışıyor, ancak diğer üç kadranda o kadar hoş değil.


1
Bu tüm kadranlarda çalışır. Bir vektörü (X, Y) döndürmek için tam formül X '= X * sin (açı) + Y * cos (açı) ve Y' = X * sin (açı) + Y * -cos'dur (Açı). Bu, yalnızca x ekseninden (1,0) döndüğünüzde yukarıdakilere basitleştirir.
Chewy Gumball

Hmmm ... kadranlarla ilgili bir dönüşüm olduğunu hatırlıyorum.
Dave Nay

2
Javascript Math.sinve benzeri radyan cinsinden girdi alır, bu yüzden dönüştürmek gerekir:radians = (degrees * (Math.PI/180)
Brian

1
Arc işlevlerini yaparken sorunlarınız olabilir. Günah (45 derece) = Günah (135 derece) bu nedenle arcsin (günah (135 derece)) 45 derece geri dönecektir; Cos (45) = Cos (315) ...
mhoran_psprep

2

Sadece Hareketli Tip Betiklerinden bir javascript uyarlaması kaydetmek için

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; }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.