Javascript + 数学 - 正确计算从 A 点到 B 点的方位角

Javascript + Maths - Get a bearing angle from a point A to B properly

在互联网上询问我找到了一个计算从点 A 到点 B 的方位角的公式,假设现在它已经工作了一半。

//Creates to points A and B and set their coordinates
var A = {
    x : 250,
    y : 250
};

var B = {
    x : 100,
    y : 250
};

var angle = Math.acos(
              (A.y - B.y) / 
              Math.sqrt(
                  Math.pow(A.x - B.x, 2) + 
                  Math.pow(A.y - B.y, 2)
              ) * (180 / Math.PI);

Fiddle 这里:https://jsfiddle.net/7js7e90k/4/

此时B点(绿点)在A点(白点)的左边,显示的角度应该是270°,但显示为90°。如果你把B点设置到右边(改变物体坐标)你会看到它也会显示90°。

我需要它来显示相对于北 (0°) 的正确角度,但它不会超过 180°,需要更改公式中的某些内容。

对于 270° 的情况,答案变为 90°,因为在这两种情况下,计算都会 return A.y - B.y 中的 0。您需要做的是检查 x 坐标以查看该点所在的位置,如果 B 点离开 A 点

,则将答案添加 180°

由于 Math.acos() return 是 0 和 π 之间的值,而不是 0 和 2π 之间的值,您可以检查点 A 是在点 B 的左侧还是右侧,并添加一个额外的 180˚如果 A 对 B.

试试这个:

var ref_angle = Math.acos((A.y - B.y) / Math.sqrt(Math.pow(A.x - B.x, 2) + Math.pow(A.y - B.y, 2))) * (180 / Math.PI);

if (B.x >= A.x) {
    var angle = ref_angle
}
else {
    angle = ref_angle + 180
}

更新:

如果您想避免使用条件,则需要使用 Math.atan2()。然而,Math.atan2() 测量相对于正 x-axis(东)和 returns 值在 -180˚ 和 180˚ 之间的角度。我修改了下面的公式,得到相对于正 y-axis(北)和 0˚ 到 360˚ 之间的 return 值的角度:

var angle = ( ( ( -(Math.atan2((A.x-B.x),(A.y-B.y))*(180/Math.PI)) % 360) + 360) % 360); 

查看此 已更新 工作 fiddle:https://jsfiddle.net/g7shjjxq/5/

您可以用切线计算它以避免取模或 IF,然后转换为 deg:

function getAngle (x1, y1, x2, y2){
    var dx = x2 - x1,
    dy = y2 - y1;
    return Math.atan2(dy,dx)*(180/Math.PI);    
}

var A = { x : 250,  y : 250};
var B = { x : 100,  y : 250};

getAngle(A.x, A.y, B.x, B.y); // == 180