我的应用程序有几个以任意 Angular 旋转的圆,我需要测试它们的旋转是否相等(相对于某些误差范围)。一个简单的实现是这样的:
function angleEquals(first, second, errorMargin) {
return Math.abs(first - second) <= errorMargin;
}
但这会失败,因为旋转可能会增长到无穷大。因此我们需要标准化两个 Angular :
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
。
有什么建议吗?
最佳答案
您需要标准化 Angular 之间的差异,而不是 Angular 本身。
diff = angle1-angle2 // calculate the difference
diff = diff % 2*PI // get it into the range [0, 2*PI)
if(diff > PI) diff -= 2*PI // get it into the range (-PI, PI]
diff = abs(diff) // get the absolute difference in the range [0,PI]
return (diff < errorMargin)
您可以采取一些措施来稍微加强一下,但它向您展示了基本的步骤顺序。
编辑:为了子孙后代,这是更严格的版本。
diff = abs((abs(angle1-angle2) + PI) % (2*PI) - PI)
return (diff < errorMargin)
(这个不依赖于负数的模数行为,并且分支较少。)
关于javascript - 测试 Angular 相等的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24943471/