我有一个处理方位角操作的代码。
我想区分方位角是否接近0,100,200,300,400或0, PI/2, PI, PI*(3/2), 2*PI, (N, E, S, W)
。
在大多数情况下,我将收到一个不在此范围内的角度,因此我需要以最快的方式丢弃我有这些值。
我想这样做是为了控制纯水平或垂直方位角的线方程。
我当然会使用epsilon方法。
所以我有:
if Math.abs(azi)< 0.0000001 ...
else if Math.abs(azi-100)< 0.0000001 ...
else Math.abs(azi-200)< 0.0000001 ...
else Math.abs(azi-300)< 0.0000001 ...
else Math.abs(azi-400)< 0.0000001 ...
else other
如您所见,我必须检查5个条件以检查我是否具有“其他”价值。
另一方面,你知道sin(N)= 0,sin(S)= 0,cos(E)= 0,cos(W)= 0,所以:
if Math.abs(Math.cos(azi) ) < 0.0000001 ...
else if Math.abs(Math.sin(azi) ) < 0.0000001 ...
else other
现在我有两个数学三角运算条件和5个简单的aritmetic运算。正如您在jsperf中看到的,算术更快。
我的问题是:还有其他快速的方法吗?
答案 0 :(得分:1)
我不确定模数性能与其他算术相比如何,但这样你至少可以将它放在一行中。
if ((azi + 0.0000001) % 100) < 0.0000002 ...
else other
除了潜在的舍入错误之外,这应该与您的代码完全相同。
I tried it on your page它似乎的速度提高了约三倍。