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。
答案 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)
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
现阶段还有三件事要做:
%
)你可以通过从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 + ...
选择能产生预期效果的那个。