2014-02-26 116 views
0

我正在考虑一个财富类型的东西,你必须检查一个标记是否落在一个插槽上。在视觉上,我们可以看到0,2pi,4pi等......处于相同的位置。如何通过编程检查0是否等于2pi/4pi?假设我也有半径,我想,也许我必须先将它转换成笛卡尔坐标,然后再比较它。但是,有没有更好的方法来做到这一点?如何比较圆弧中的弧度?

编辑:另外,我应该清楚标记可以落在插槽之间的任何位置。例如,标记可以在0到π/ 6之间的任何地方。

回答

1

这是你想要的吗?

var smallestEquivalentValueInRadians = originalValueInRadians % (2 * Math.PI); 

如果你想比较,你可以这样做:

a % (2 * Math.PI) === b % (2 * Math.PI) 

%是求余运算,基本上它减去第一,多次第二个操作数,因为它可以(假设你是处理正数)。

为了应付负值:

function normalizeRadian(a) { 
    var circle = Math.PI * 2; 
    a = a % circle; 
    if (a < 0) { 
    a += circle; 
    } 
    return a; 
} 

也比较浮点数时,这是一个好主意,有一些“fuzzyness”,因为他们opperations可能不够精确。

function fuzzyEqual(a, b) { 
    var fuzz = 0.001; 
    return a < b + fuzz && a > b - fuzz; 
} 

因此,完整的解决方案是:

function fuzzyEqualRadians(a, b) { 
    return fuzzyEqual(normalizeRadian(a), normalizeRadian(b)); 
} 
+0

我不明白为什么2%? –

+0

我不确定我的问题写得不好,但这不起作用。 '(0 * Math.PI)%2 ===(2 * Math.PI)%2'是'false' – Strawberry

+0

你让我打开维基百科:)对不起,它是(2 * Math.PI),而不是2 – sabof