给出笛卡尔坐标中的多边形(不是必要的凸),我想知道是否有办法检查该多边形的对称性?
我可以想到一个O(N)解决方案:使用旋转卡尺检查每对相对边是否平行且大小相等。但是,我无法证明该算法的正确性。你能建议更好的解决方案吗?
答案 0 :(得分:2)
这将证明你的多边形确实是对称的。
复杂性:N,假设您可以从坐标直接访问顶点。
答案 1 :(得分:0)
你必须更清楚地说明允许什么样的对称性。中心对称(也就是180度旋转)?镜像对称于其中一个轴?任何程度的轮换?在某些应用程序中,只允许通过0,90,180,270 +镜像旋转......在每种情况下答案都会有所不同。
仅对于中心对称,如果假设多边形是很好的代表(即边缘上没有额外的顶点,并且顶点保持在包含前向运算符的顶点中),则中心对称多边形将具有偶数2 * N个调整,你可以这样做:
将iter1引用设置为第0个顶点,将iter2设置为引用第N个顶点。
重复N次:
if(* iter1!= * iter2)返回false;
return true;
答案 2 :(得分:0)
首先需要定义要检查的对称类型(多边形应该不变的转换)。您提供的算法将检查凸多边形的中心对称性(因为旋转卡尺仅适用于凸多边形)。