Tìm tọa độ mới bằng cách sử dụng điểm bắt đầu, khoảng cách và góc


12

Được rồi, nói rằng tôi có một tọa độ điểm.

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

Bây giờ tôi cũng có một khoảng cách và một góc.

var distance = 20;
var angle = 72;

Vấn đề tôi đang cố gắng giải quyết là, nếu tôi muốn di chuyển 20 điểm theo hướng góc từ tọa độ bắt đầu, làm thế nào tôi có thể tìm thấy tọa độ mới của mình sẽ là gì?

Tôi biết câu trả lời liên quan đến những thứ như sin / cosine, vì tôi đã từng biết cách làm điều này, nhưng tôi đã quên mất công thức. Có ai giúp được không?


1
72 độ từ cái gì? Trục X, trục Y? Thứ gì khác? Theo chiều kim đồng hồ, ngược chiều kim đồng hồ?
pdr

@pdr 90 độ sẽ là hướng bắc, 45 độ sẽ là hướng đông bắc, v.v.
dqhendricks

Câu trả lời:


5

SOHCAHTOA

Sine = Đối diện / Hypotenuse Cosine = Liền kề / Hypotenuse Tangent = Đối diện / Liền kề

Trong ví dụ của bạn:

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

Vấn đề là bạn phải cẩn thận với góc phần tư bạn đang làm. Cái này hoạt động hoàn hảo ở góc phần tư phía trên bên phải, nhưng không đẹp lắm trong ba góc phần tư còn lại.


1
Điều này hoạt động trong tất cả các góc phần tư. Công thức đầy đủ để xoay một vectơ (X, Y) là X '= X * sin (góc) + Y * cos (góc) và Y' = X * sin (góc) + Y * -cos (Góc). Điều này đơn giản hóa những gì bạn có ở trên khi chỉ xoay từ trục x (1,0).
Chewy Gumball

Hmmm ... tôi đang nhớ biến đổi nào có một hình ảnh liên quan đến góc phần tư?
Dave Nay

2
Lưu ý rằng trong javascript Math.sinvà những thứ tương tự lấy đầu vào bằng radian, vì vậy bạn sẽ cần phải chuyển đổi:radians = (degrees * (Math.PI/180)
Brian

1
@DaveNay bạn có vấn đề khi thực hiện các chức năng Arc. Sin (45degrees) = Sin (135degrees) do đó arcsin (sin (135degrees)) sẽ trả lại 45degrees; Cos (45) = Cos (315) ...
mhoran_psprep

2

Chỉ để ghi lại một bản chuyển thể javascript từ Tập lệnh Kiểu di chuyển

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; }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.