高效近似旋转

时间:2010-11-21 13:42:36

标签: algorithm performance approximation

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

然而,正方形的角落需要匹配,因此要获得匹配,旋转的正方形的右上角必须足够接近原来旋转的正方形的右上角。

我试图尽可能提高效率,所以如果基于上述标准的两个方格的接近度变差,我知道我需要尝试向相反方向旋转。

我已经编写了旋转方块的方法,并测试它们彼此之间的距离

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

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

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

非常感谢任何想法。

3 个答案:

答案 0 :(得分:0)

这个方案怎么样:

以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. 将搜索空间划分为两个orthants(如果搜索空间是从A到B,则第一个orthant为A + (A + B) / 2,第二个orthant为B - (A + B) / 2
  2. 检查左orthant:按A + (A + B) / 4旋转。进行比较。
  3. 检查右orthant:按B - (A + B) / 4旋转。进行比较。
  4. 根据左侧或右侧是否具有更高的匹配值,调整搜索空间,左侧orthant或右侧orthant。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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