javascript - 测试 Angular 相等的算法

标签 javascript math geometry angle

我的应用程序有几个以任意 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/

相关文章:

c# - C# 和 Java 之间的随机行为差异 : the seed

java - 如何解释迭代最近点 (ICP) 算法的距离

c++ - atan(-M_PI_2) 不返回 -90 º

html - 为什么我的表格中的圆形单元格大小不同?

html - 具有属性位置(相对、绝对)或 float 的 Shape-outside

opengl - 如何使用 3x3 单应性将立方体增加到特定位置

javascript - 在小书签中使用 JS setTimeout

javascript - 如何判断 Google 电子表格的 Google Apps 脚本中两个单元格是否相等

javascript - 如何获取本地存储值

javascript - 如何处理 Net Core 中的 net::ERR_INTERNET_DISCONNECTED 错误