0
我正在考虑一个财富类型的东西,你必须检查一个标记是否落在一个插槽上。在视觉上,我们可以看到0,2pi,4pi等......处于相同的位置。如何通过编程检查0是否等于2pi/4pi?假设我也有半径,我想,也许我必须先将它转换成笛卡尔坐标,然后再比较它。但是,有没有更好的方法来做到这一点?如何比较圆弧中的弧度?
编辑:另外,我应该清楚标记可以落在插槽之间的任何位置。例如,标记可以在0到π/ 6之间的任何地方。
我正在考虑一个财富类型的东西,你必须检查一个标记是否落在一个插槽上。在视觉上,我们可以看到0,2pi,4pi等......处于相同的位置。如何通过编程检查0是否等于2pi/4pi?假设我也有半径,我想,也许我必须先将它转换成笛卡尔坐标,然后再比较它。但是,有没有更好的方法来做到这一点?如何比较圆弧中的弧度?
编辑:另外,我应该清楚标记可以落在插槽之间的任何位置。例如,标记可以在0到π/ 6之间的任何地方。
这是你想要的吗?
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));
}
我不明白为什么2%? –
我不确定我的问题写得不好,但这不起作用。 '(0 * Math.PI)%2 ===(2 * Math.PI)%2'是'false' – Strawberry
你让我打开维基百科:)对不起,它是(2 * Math.PI),而不是2 – sabof