Javascript+;数学-正确获得从a点到B点的方位角
在互联网上,我找到了一个公式来计算从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(
//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 inA.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。