Javascript + Maths - 正确地从A点到B点获得方位角

时间:2016-01-02 04:09:26

标签: javascript math 2d

在互联网上询问我找到了一个公式来找到从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);

在这里小提琴:https://jsfiddle.net/7js7e90k/4/

现在B点(GREEN DOT)位于A点(WHITE DOT)的左侧,显示的角度应为270°,但显示为90°。如果您将点B设置为右侧(更改对象坐标),您将看到它也将显示90°。

我需要它来显示相对于北方(0°)的适当角度,但它不会超过180°,需要在公式中改变。

3 个答案:

答案 0 :(得分:2)

您可以使用atangent计算,以避免模数或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

答案 1 :(得分:1)

由于Math.acos()返回的值介于0和π之间而不是介于0和2π之间,因此您可以检查A点是否位于B点的左侧或右侧,如果A位于B位置,则添加额外的180˚

试试这个:

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轴(东)的角度,并返回-180˚和180˚之间的值。我修改了下面的公式得到相对于正y轴(北)的角度,并返回0˚和360˚之间的值:

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

查看 UPDATED 工作小提琴:https://jsfiddle.net/g7shjjxq/5/

答案 2 :(得分:0)

对于270°情况,答案变为90°,因为在这两种情况下,计算将在A.y - B.y中返回0。您需要做的是检查x坐标以查看该点的位置,如果B点留在A点,则将答案加180°