Javascript+;数学-正确获得从a点到B点的方位角

Javascript+;数学-正确获得从a点到B点的方位角,javascript,math,2d,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(

在互联网上,我找到了一个公式来计算从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);
在这里拉小提琴:

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


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

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

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

,则为答案添加180°,因为
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); 
查看此更新的工作小提琴:

由于
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); 

查看此更新的工作小提琴:

您可以使用atangent计算,以避免模或IFs,然后转换为度:

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

您可以使用atangent计算,以避免模或IFs,然后转换为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

我喜欢这个,这是一个很好的“破解”,我想知道是否有一个实际的方法来修复这个公式。@Juan Bonnett你是对的,使用条件句有点“破解”。看看我的最新配方和提琴。效果很好!让我们用这个!呵呵,很抱歉,发现了一个问题,但应该简单解决。当B在左边时,它以南极为北极,检查这把小提琴,它不应该接近180,但接近360,就像一半的橙色像这样,这是一个很好的“破解”,我想知道是否有实际的方法来修复公式。@Juan Bonnett你是对的,使用条件句有点“破解”。看看我的最新配方和提琴。效果很好!让我们用这个!呵呵,很抱歉,发现了一个问题,但应该简单解决。当B在左边时,它以南极为北极,检查这把小提琴,它不应该接近180,而是接近360,就像一半的橘子被发现了,北极点是-90,我认为它从0到180,然后开始计数负数。不管怎样,你可以让它从0开始(北)一直数到359?我想你可以简单地把180加到上面的输出中,从+/-180转换到0-359。我注意到北角是-90,这让我觉得它从0到180,然后开始计数负数。不管怎样,你可以让它从0开始(北)一直数到359?我认为您可以简单地将180添加到上述输出中,以将+/-180转换为0-359。