在互联网上询问我找到了一个公式来找到从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°,需要在公式中改变。
答案 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°