排序多边形的点

时间:2011-09-10 04:54:35

标签: algorithm geometry computational-geometry

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

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

ABCD顺序中的多边形具有交叉边。但是在ABDC订单中:

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

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

我该怎么做?

2 个答案:

答案 0 :(得分:9)

在多边形上选择两个点。该线的中点将包含在该多边形内。那就是M.

然后,根据基于M(沿X轴)的角度对点进行排序,根据距离M的距离打破简并性。按顺序迭代确保没有两条边相交。

答案 1 :(得分:9)

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

  1. 使用最小和最大X值选择两个极值点(称为X min 和X max )并在它们之间绘制线。如果您在极值处有多个具有相同X值的点,请选择具有最小Y值的X min ,并使用最大Y值选择X max
  2. 将点列表拆分为两个子列表,其中连接X min 和X max 的行下方的所有点都在一个列表中,所有那些点都在该行之上在另一个。在第一个列表中包含X min ,在第二个列表中包含X max
  3. 按X值的升序对第一个列表进行排序。如果您有多个具有相同X值的点,请按升序Y值对它们进行排序。这应该仅发生在与X max 具有相同X分量的点上,因为多边形是凸的。
  4. 按X值的降序对第二个列表进行排序。同样,在具有相同X值的多个点的情况下,以Y值下降排序(这应该仅发生在具有X分量X min 的点上。
  5. 将两个列表附加在一起(首先是哪个是无关紧要的。)