优雅高效的多边形对称性判定算法

前言

在计算几何、机器人运动规划、图像轮廓分析中,我们常常需要知道一个平面图形的对称性(包括旋转对称、轴对称和镜像对称)。那么给定一个平面简单多边形,是否存在O(n)的算法,找出其所有的对称轴和旋转对称角度?

答案是肯定的。下面我们一起来看看这一优雅高效的算法吧。

对称问题的巧妙转化

对于对称性求解,一个直接的方法就是逐个顶点依次尝试(对于轴对称,还要尝试边的中点),然后判断图形是否重合,但是这种做法时间复杂度O(n^2),太过愚蠢。

其实上述逐点尝试比对的过程,有点像字符串匹配问题:在字符串A中寻找字符串S。

假设串B的长度为n,串A的长度为m,我们知道KMP算法可以在O(m+n)的时间复杂度内找到A中所有S的匹配位置。

我们将KMP算法推广一下,它可以用于任何信息串的匹配。只要修改相应的比较函数即可。

将多边形按照某种规则进行编码,得到模式串S,然后通过合理构造匹配串A,使用KMP算法在A中寻找S的匹配,即可求解得到S的对称性。利用KMP思想判断对称性的过程如下:

  1. 编码:将多边形按照某种规则进行编码,编码成信息串S;
  2. 构造匹配串:根据要判断旋转对称还是轴对称来构造不同的匹配信息串A
  3. 匹配:用KMP算法在A中寻找S的匹配位置
  4. 解码:找到对称轴/对称角度

下面对此进行详细说明。

旋转对称

             

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值