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
在互联网上询问我找到了一个计算从点 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 点
由于 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