我的應用程序有幾個圓以任意角度旋轉,我需要測試它們的旋轉是否相等(相對於一些誤差)。一個天真的執行是這樣的:測試角度相等的算法
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