需要帮助了解方向公式

时间:2016-07-05 07:39:39

标签: javascript math

Math.round((((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90) + 3) % 4;

您好,

此公式应该在x y平面中获取坐标,并返回0-3的整数,用于描述坐标的位置。

  

0:顶部,1:右,2:底部,3:左边。

我知道math.atan2获取角度,然后180 / pi将其转换为度数。作者说他增加了180以消除负数,但我不明白为什么会有任何负数。然后他添加3并使用模运算符4(因为4个象限)。

有谁理解为什么他会增加180然后增加3? 更令人困惑的是,如果我插入像pi / 2这样的角度(应该返回0:顶部),我得到2。

2 个答案:

答案 0 :(得分:2)

此公式适用于坐标系MM_TEXT,其中零角度为正方向,Pi / 2角度为向下方向。

步骤一步:

* (180 / Math.PI)将角度范围转换为-180..180度
+ 180将角度范围转换为0..360度,因此右方向(旧零)变为180
/ 90使0..4范围,所以右方向(旧零)变为2
+ 3将范围移至3..7,因此右方向(旧零)变为5
% 4获得模数,因此正方向(旧零)变为1

答案 1 :(得分:0)

实际上,反正切可以返回负角度。如MDN docs on atan2中所述:

  

返回介于-π和π

之间的数值

例如,对于点( - 1,-1) atan(y,x)返回 - (3/4)π= -135 °

console.log(Math.atan2(-1, -1));

因此,通过添加180,公式会将范围[-180,+ 180]转换为[0,360]。

公式中的下一步是除以90,然后舍入该结果。所以现在上面的范围减少到值 {0,1,2,3,4} 。但是,由于我们增加了180°,这些数字会发生变化:

Original angle range | After adding 180 | After dividing
---------------------+------------------+---------------
   -180...-135       |    0... 45       |      0
   -135... -45       |   45...135       |      1
    -45...  45       |  135...225       |      2
     45... 135       |  225...315       |      3
    135... 180       |  315...360       |      4

现阶段还有三件事要做:

  • 范围{0,1,2,3}之外的值(如4)需要在其中映射。这就是模运算符的作用(%
  • 编号需要移位,因为你希望顶部得到数字0(除法之后90,顶边角度得到数字3)。
  • 编号方向需要相反,因为您希望编号为1,而目前编号是逆时针编号。

你可以通过从7中减去中间结果(而不是向它添加3)来实现这一点,然后取模数:

Original angle range | After adding 180 | After dividing | Subtract from 7 | Modulo 4
---------------------+------------------+----------------+-----------------+---------
   -180...-135       |    0... 45       |      0         |     7           |    3
   -135... -45       |   45...135       |      1         |     6           |    2
    -45...  45       |  135...225       |      2         |     5           |    1
     45... 135       |  225...315       |      3         |     4           |    0
    135... 180       |  315...360       |      4         |     3           |    3

在JavaScript中使用的表达式:

(7 - Math.round(((Math.atan2(y, x) * (180 / Math.PI)) + 180) / 90)) % 4

其他编号

实际上有8种方法可以从0到3连续编号:有4种方法可以选择哪个部分为0,以及2个方向:顺时针或逆时针。

以下是对这8种可能性中每一种的公式开头的修改:

(7 -  ...
(6 -  ...
(5 -  ...
(4 -  ...
(0 +  ...
(1 +  ...
(2 +  ...
(3 +  ...

选择能产生预期效果的那个。