【问题标题】:Check if a polygon is symmetric检查多边形是否对称
【发布时间】:2011-08-18 08:52:34
【问题描述】:

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

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

【问题讨论】:

  • 根据您对提议的解决方案的描述,我假设您只是在寻找 180° 旋转对称,而不是任何其他类型(例如 120° 旋转、反射等)
  • 检查对仅适用于边数为偶数的多边形。
  • 我认为所有边数为奇数的多边形都不能对称? @@
  • 它们可以是旋转对称的。
  • 等边(3条边)不是对称的吗?您绝对可以将其对折,这是对称的一种定义。

标签: algorithm geometry polygon computational-geometry symmetric


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您必须更清楚地说明允许什么样的对称性。中心对称(又名 180 度旋转)?在其中一个轴上镜像对称?任何程度的旋转?在某些应用程序中,只允许旋转 0,90,180,270 + 镜像...答案在每种情况下都会有所不同。

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

    1. 设置iter1引用第0个顶点,设置iter2引用第N个顶点。

    2. 重复N次:

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

    3. 返回真;

    【讨论】:

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

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

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

      【讨论】:

      • 这只会检查垂直轴的对称性。
      • @Ezku - Heandel 正在反转两个坐标,所以我认为这个解决方案是检查旋转对称性,而不是反射对称性,就像 OPs 最初的提议一样
      • 如果多边形的一侧在边上有一个点,而在另一侧边上没有相同的边的多边形上没有出现怎么办?所以A有点(0,0),(0,1),(0,2),B有边(2,0),(2,2)。通过 x=2 的反射线,它们可能是相同的。您需要先确保多边形没有多余的点...
      • 这会检查多边形是否具有相同的顶点,但不能保证它们以相同的顺序连接。
      • 显然,并不是每个三角形都是对称的。但是等边三角形,例如,具有三个反射对称和三个旋转对称,您的算法将找不到任何一个。
      猜你喜欢
      • 2011-06-17
      • 2022-01-17
      • 2018-02-15
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多