给定笛卡尔坐标中的多边形(不是必须的凸面),我想知道是否有任何方法可以检查该多边形的对称性?

我可以想到一个O(N)解决方案:使用旋转卡尺检查每对相对的边是否平行且大小相等。但是,我无法证明该算法的正确性。您能提出更好的解决方案吗?

有帮助吗?

解决方案

  • 您计算多边形的重心。
  • 将其转换为原点,以便您的重心具有(0,0)作为坐标。
  • 然后对于坐标(i,j)的每个顶点,检查是否存在一个坐标为(-i,-j)的顶点。

    这将证明您的多边形确实是对称的。

    复杂度:N,假设您可以直接从其坐标访问顶点。

其他提示

您必须更清楚地说明允许哪种对称。中心对称(也称为180度旋转)?在其中一个轴上镜像对称?旋转了多少度?在某些应用程序中,仅允许旋转0,90,180,270 +镜像...每种情况下答案都是不同的。

仅对于中心对称,如果您假设多边形可以很好地表示(例如,边上没有多余的顶点,并且顶点被包含在正向运算符中,则中心对称多边形将具有偶数2 * N个顶点),您可以这样做:

  1. 设置iter1参考第0个顶点,iter2参考第N个顶点。

  2. 重复N次:

    if(* iter1!= * iter2)返回false;

  3. 返回true;

您首先需要定义要检查的对称类型(多边形应进行何种变换)。您提供的算法将检查凸多边形的中心对称性(因为旋转卡尺仅适用于凸多边形)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top