前言
在计算几何、机器人运动规划、图像轮廓分析中,我们常常需要知道一个平面图形的对称性(包括旋转对称、轴对称和镜像对称)。那么给定一个平面简单多边形,是否存在O(n)的算法,找出其所有的对称轴和旋转对称角度?
答案是肯定的。下面我们一起来看看这一优雅高效的算法吧。
对称问题的巧妙转化
对于对称性求解,一个直接的方法就是逐个顶点依次尝试(对于轴对称,还要尝试边的中点),然后判断图形是否重合,但是这种做法时间复杂度,太过愚蠢。
其实上述逐点尝试比对的过程,有点像字符串匹配问题:在字符串A中寻找字符串S。
假设串B的长度为n,串A的长度为m,我们知道KMP算法可以在O(m+n)的时间复杂度内找到A中所有S的匹配位置。
我们将KMP算法推广一下,它可以用于任何信息串的匹配。只要修改相应的比较函数即可。
将多边形按照某种规则进行编码,得到模式串S,然后通过合理构造匹配串A,使用KMP算法在A中寻找S的匹配,即可求解得到S的对称性。利用KMP思想判断对称性的过程如下:
- 编码:将多边形按照某种规则进行编码,编码成信息串S;
- 构造匹配串:根据要判断旋转对称还是轴对称来构造不同的匹配信息串A
- 匹配:用KMP算法在A中寻找S的匹配位置
- 解码:找到对称轴/对称角度
下面对此进行详细说明。
旋转对称