【问题标题】:Efficient approximation of rotation高效近似旋转
【发布时间】:2010-11-21 13:42:36
【问题描述】:

我正在尝试编写一种算法,该算法在 2D 中围绕其中心旋转一个正方形,直到它与从相同位置开始、大小相同且中心相同的旋转正方形匹配或“足够接近”。这相当容易。

但是正方形的角需要匹配,因此要获得匹配,要旋转的正方形的右上角必须足够接近旋转正方形的原始右上角。

我正在努力使其尽可能高效,因此如果基于上述标准的两个正方形的接近度变得更差,我知道我需要尝试向相反方向旋转。

我已经编写了旋转正方形的方法,并测试它们彼此之间的接近程度

我的主要问题是我应该如何根据我的接近程度来更改每次迭代的旋转量

例如如果当前测量值比前一个更近,则将角度减半并沿相同方向移动,否则将角度加倍并沿相反方向旋转?

但是我不认为这在效率方面是一个很差的解决方案。

任何想法都将不胜感激。

【问题讨论】:

  • 你的数据是什么?它是如何存储/表示的?
  • 你为什么不计算旋转正方形的边角?这是 O(1) 中的微不足道的三角函数。
  • 它只是存储为四个坐标,我没有计算角度,因为它比所描述的近似是最好的方法要大得多。
  • 所以近似它,但你知道你想要最终的角度,所以只需通过任何你喜欢的方法将角度差运行到零 - 线性、二阶、指数衰减等等。

标签: algorithm performance approximation


【解决方案1】:

这个方案怎么样:

以 0、90、180、270 度角旋转(请注意,这些特殊旋转比通用旋转有更有效的算法);比较它们中的每一个以找到您需要搜索的象限。也就是说,尝试找到匹配度最高的两个轴。

然后进行二分搜索,例如,当您确定旋转的正方形位于 90-180 象限中时,然后将搜索区域划分为两个八分圆:90-135 和 135-180。旋转 90+45/2 和 180-45/2 并进行比较。如果 90+45/2 旋转的匹配值高于 180-45/2,则继续在 90-135 八分圆中搜索,否则继续在 135-180 八分圆中搜索。起泡、冲洗、重复。

每次在递归中,你都这样做:

  1. 将搜索空间分成两个orthant(如果搜索空间是从A到B,那么第一个orthant是A + (A + B) / 2,第二个orthant是B - (A + B) / 2
  2. 检查左方位:旋转A + (A + B) / 4。比较。
  3. 检查右象素:旋转B - (A + B) / 4。比较。
  4. 根据左侧或右侧的匹配值是否更高,调整搜索空间,向左或向右。

【讨论】:

    【解决方案2】:

    我能想到的另一种方案是,您尝试定位旋转图像的“角落”,而不是尝试旋转和搜索。

    如果您的图像不包含任何透明胶片,则在远离中心的sqrt(width^2+height^2) 处有四个点,其颜色与未旋转图像的边角完全相同。这将限制您需要搜索的旋转次数。

    【讨论】:

      【解决方案3】:

      ...此外,要基于此处的其他建议,请记住,对于围绕其中心旋转的任何矩形,您只需要计算 单个角 的旋转。您可以通过添加或减去为获得第一个角而计算的相同偏移量来推断其他三个角。这应该会加快您的计算速度(假设 [但不认为] 这是这里的瓶颈)。

      【讨论】:

        猜你喜欢
        • 2012-10-22
        • 2011-04-08
        • 1970-01-01
        • 2012-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-30
        • 1970-01-01
        相关资源
        最近更新 更多