【问题标题】:Problems detecting 180 degree rotation检测 180 度旋转的问题
【发布时间】:2011-07-13 14:17:28
【问题描述】:

我有一个算法可以计算物体旋转的量。

它计算 -180 到 180 度之间来处理顺时针和逆时针。但是,当旋转大约 180 度时,由于舍入,在比较形状的不同部分时最终会检测到 -180 度和 180 度旋转的混合,这取决于舍入的发生方式,这会将实际旋转抛出很多。答案是使用绝对值,但这最终会破坏旋转方向。

这里是代码

 double newAngle = objOneAngle - objTwoAngle;
 if (newAngle< -180)
     newAngle += 360;
 else if (newAngle > 180)
     newAngle -= 360;

对增强上述代码以处理 180 度旋转的最佳方法有什么想法吗?

编辑: 想到的最明显的方法是将正负值分开,然后根据大小或其他一些指标选择最佳集合,但必须有更简单更优雅的解决方案?

【问题讨论】:

    标签: algorithm geometry


    【解决方案1】:

    将一些旋转测量为略高于 180 度,而将一些旋转测量为略小一些,这本身应该不是问题。我怀疑真正的问题在于您如何组合来自“形状的不同部分”的这些旋转。例如,如果您对旋转进行平均,那么这将产生绝对疯狂的结果。您可以采取以下三种方法。

    (1) 以某种不受差异影响的方式计算“典型旋转”图形:例如,随机选择一个旋转。 (如果它们中的一些可能严重错误,那么您可以做更强大的事情。)现在调整所有旋转,使“典型”的旋转为零:

    for (i=0; i<nSamples; ++i) {
      rotations[i] -= typicalRotation;
      if (rotations[i]<-180) rotations[i] += 360;
      else if (rotations[i]>180) rotations[i] -= 360;
    }
    

    现在平均 这些(或对它们做任何你正在做的事情),然后通过反向执行相同的操作来纠正。

    (2) 与 (1) 一样,但要么使用原样旋转,要么在处理前后将它们全部调整 180 度。选择要执行的操作,例如,计算 -90 到 +90 之间的旋转次数,看看它们是多于还是少于所有旋转的一半。

    (3) 不是平均旋转角度,而是为每个角度计算 (cos theta, sin theta) 并平均 那些。然后使用atan2 将平均值转换回角度。 (想法是角度是圆上的“真正”点,因此最好使用这些点而不是角度。当你这样做时,-180 度和 +180 度之间的歧义就会消失。)

    如果你正在做的真的是平均,我最喜欢的是 3。你的里程可能会有所不同。

    【讨论】:

    • 谢谢,精彩的回答。 3 会很棒。
    【解决方案2】:

    处理浮点比较中舍入误差的常用方法是添加一个小的容差:

    double newAngle = objOneAngle - objTwoAngle;
    if (newAngle < -180.000001)
        newAngle += 360;
    else if (newAngle > 180.000001)
        newAngle -= 360;
    

    这样就不会修改足够接近 180 的值。

    【讨论】:

    • 我不相信提问者的问题出在那儿。也就是说,无论他在这个阶段究竟做了什么,他最终可能会得到接近 -180 和 +180 的混合值(当实际旋转恰好是大约 180 度时),然后他会做什么下一步 i> 对所有这些旋转数字感到困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 2019-11-25
    相关资源
    最近更新 更多