Algorithm 检查多边形是否对称

Algorithm 检查多边形是否对称,algorithm,geometry,polygon,computational-geometry,symmetric,Algorithm,Geometry,Polygon,Computational Geometry,Symmetric,给定笛卡尔坐标系中的一个多边形(不一定是凸的),我想知道是否有任何方法可以检查该多边形的对称性 我可以想出一个O(N)解决方案:使用旋转卡钳检查每对相对边是否平行且大小相等。然而,我无法证明该算法的正确性。你能提出更好的解决方案吗? 计算多边形的重心 将其平移到原点,以便重心以(0,0)为坐标 然后,对于坐标(i,j)的每个顶点,检查是否存在具有坐标(-i,-j)的顶点 这将证明你的多边形确实是对称的 复杂性:N,假设您可以从顶点的坐标直接访问顶点。您必须更清楚地说明允许哪种对称。中心对称性(

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

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

  • 计算多边形的重心
  • 将其平移到原点,以便重心以(0,0)为坐标
  • 然后,对于坐标(i,j)的每个顶点,检查是否存在具有坐标(-i,-j)的顶点
这将证明你的多边形确实是对称的


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

您必须更清楚地说明允许哪种对称。中心对称性(又称180度旋转)?其中一个轴的镜像对称性?以任何程度旋转?在某些应用中,仅允许旋转0,90180270+镜像。。。在每种情况下,答案都是不同的

仅对于中心对称,如果您假设多边形很好地重新输入(即边上没有额外的顶点,并且顶点保持在包含有正向运算符的区域中,则中心对称多边形将具有偶数2*N个验证,您可以执行以下操作:

  • 设置iter1参考第0个顶点,并将iter2设置为参考第n个顶点

  • 重复N次:

    如果(*iter1!=*iter2)返回false

  • 返回true


  • 首先需要定义要检查的对称类型(多边形应保持不变的变换)。您提供的算法将检查凸多边形的中心对称性(因为旋转卡钳仅适用于凸多边形).

    这将只检查沿垂直轴的对称性。@Ezku-Heandel正在反转两个坐标,因此我认为此解决方案是检查旋转对称性,而不是反射对称性,如OPs原始提案中所述。如果多边形的一侧有一个点位于边上,而另一侧没有出现该点,则多边形s是一条相同的边?所以A有点(0,0),(0,1),(0,2),B有边(2,0),(2,2)。它们可以通过x=2的反射线完全相同。您需要首先确保多边形没有多余的点…这会检查多边形是否有相同的顶点,但不能保证它们以相同的顺序连接。显然,不是每个三角形都是对称的。但是,例如,等边三角形有三个反射对称和三旋转对称,您的算法不会找到任何一种。根据您对建议解决方案的描述,我假设您只寻找180°旋转对称,而不是任何其他类型(例如120°旋转对称、反射对称等)检查对仅适用于边数为偶数的多边形。我认为所有边数为奇数的多边形都不可能是对称的?@@2它们可以是旋转对称的。等边(3边)不是对称的吗?您完全可以将其对折,这是对称的一个定义。