【问题标题】:Sorting polygon's points对多边形的点进行排序
【发布时间】:2011-11-14 05:52:09
【问题描述】:

我有一个凸多边形 ABCDE...(它可以有任意数量的点)。我需要对其所有顶点进行排序,这样所有边都不会相交。
示例:

A _____ B
  \   /
   \ /
    X
   / \
  /___\
C       D

ABCD 顺序的那个多边形有相交的边。但是按照 ABDC 顺序:

A _____ B
  |   |
  |   |
  |   |
  |   |
  |___|
C       D

没有一条边相交,所以 ABDC 是预期的输出。

我该怎么做?

【问题讨论】:

标签: algorithm geometry computational-geometry


【解决方案1】:

假设您的点都在多边形的凸包上,您可以使用以下方法:

  1. 选择具有最小和最大 X 值的两个极值点(称为 Xmin 和 Xmax)并在它们之间画线。如果您在极端情况下有多个 X 值相同的点,请选择 Y 值最小的 Xmin 和 Y 值最大的 Xmax。李>
  2. 将点列表拆分为两个子列表,其中连接 Xmin 和 Xmax 的线下方的所有点都在一个列表中,而该线上方的所有点在另一个。在第一个列表中包含 Xmin,在第二个列表中包含 Xmax
  3. 按 X 值的升序对第一个列表进行排序。如果您有多个 X 值相同的点,请按 Y 值升序对它们进行排序。这应该只发生在与 Xmax 具有相同 X 分量的点上,因为多边形是凸的。
  4. 按 X 值的降序对第二个列表进行排序。同样,如果多个点具有相同的 X 值,则按降序 Y 值排序(这应该只发生在具有 X 分量 Xmin 的点上。
  5. 将两个列表附加在一起(不管哪个在前)。

【讨论】:

  • 仅供参考:绝对不需要使用反三角函数对点进行径向排序。您可以根据实际值 (y - y0)/(x-x0) 进行排序。这就是格雷厄姆扫描的核心
  • @Foo Bah:感谢您指出这一点。从你的回答看不清楚。顺便说一句,您是否对答案投了反对票?如果是这样,你为什么要编辑它?
  • 我编辑它是因为我想撤消我的反对票,然后忘记了这样做。我现在已经删除了。
【解决方案2】:

在多边形上选择两个点。线的中点将包含在该多边形内。设该点为 M。

然后,根据与 M(沿 X 轴)的角度对点进行排序,根据与 M 的距离打破退化。按该顺序迭代可确保没有两条边会相交。

【讨论】:

  • 好主意!
猜你喜欢
  • 2015-04-07
  • 2012-12-05
  • 1970-01-01
  • 2012-07-18
  • 2014-05-23
  • 2015-10-04
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多