我正在考虑一种幸运轮式的东西,你必须检查一个标记是否落在一个槽上。在视觉上,我们可以看到0,2pi,4pi等......处于相同的位置。如何以编程方式检查0是否等于2pi / 4pi?假设我也有半径,我想,也许我必须首先将其转换为笛卡尔坐标然后进行比较。但是,有更好的方法吗?
编辑:另外,我应该明确标记可以落在插槽之间的任何位置。例如,标记可以是介于0到pi / 6之间的任何位置。
答案 0 :(得分: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;
}
同样在比较浮点数时,最好有一些“模糊性”,因为对它们的操作可能是不精确的。
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));
}