我的应用程序有几个圆以任意角度旋转,我需要测试它们的旋转是否相等(相对于一些误差)。一个天真的执行是这样的:测试角度相等的算法
function angleEquals(first, second, errorMargin) {
return Math.abs(first - second) <= errorMargin;
}
但是这样做失败了,因为旋转可能会增长到无穷大。因此,我们需要规范化两个角度:
function normalizeAngle(angle) {
angle = angle % (2 * Math.PI); // normalize the angle to the interval [-2 * pi, 2 * pi]
if (angle < 0)
return 2 * Math.PI + angle; // normalize the angle to the interval [0, 2 * pi]
return angle;
}
这工作几乎总是但也有一些角落情况下失败。例如 angleEquals(0, 2 * Math.PI - 1e-4, 1e-3)
是false
。
有什么建议吗?
如果* angle1 *可以小于* angle2 *,那么'diff = diff%2 * PI'不会导致'[-2PI,+ 2PI]'的范围。另外,如果'angle1 =0π'和'angle2 =1.9π',它们之间的角度是'0.1π',而上述将返回'0.9π'。 – RobG
请注意,当您可能打算使用'diff%(2 * PI)'时,'diff%2 * PI'等于'(diff%2)* PI'。 – RobG
@RobG我使用模块化算术的“正常”定义,其结果总是正面的。不幸的是,这与C的标准模量函数不同。 (我上面的语法快速而松散......当然'''''对于浮点数不会做任何事情。)你可以通过加2 * PI和做第二个模数来解决这个问题。 – Sneftel