【发布时间】:2018-12-07 01:40:26
【问题描述】:
给定一个 Python 列表,其中包含 4 个点的 8 个 x、y 坐标值(全部为正),如 [x1, x2, x3, x4, y1, y2, y3, y4]((xi, yi) 是第 i 个点的 x 和 y 坐标),
我如何对其进行排序,以便新列表 [a1, a2, a3, a4, b1, b2, b3, b4] 使得 1 2 3 4 的坐标 (ai, bi) 按顺时针顺序排列,其中 1 最接近 xy 平面的原点,即类似
2--------3
| |
| |
| |
1--------4
点将大致形成一个平行四边形。
目前,我正在考虑找到 (x+y) 的最小值为 1 的点,然后在剩余坐标中找到 x 最小的点为 2,通过 (x + y) 的最大值找到 3,其余为 4点
【问题讨论】:
-
从中心获取 atan2。
-
@IgnacioVazquez-Abrams 这是个好主意
-
不需要直接计算角度。只需使用 2D 叉积的符号作为比较器对它们进行排序。
-
@meowgoesthedog 这也可以,但不如计算角度那么有效,因为使用 2D 叉积的符号意味着使用
cmp函数来比较列表中的两个坐标一次。计算角度意味着我们可以将它们用作key参数的比较值,这样效率更高。见Why is the cmp parameter removed from sort/sorted in Python3.0? -
@meowgoesthedog 第二个想法实际上是行不通的,因为对于列表中的每个坐标,总会有另一个坐标,其到质心的向量与所述坐标的向量顺时针方向,所以不会有比较的“底部”。在 OP 的情况下,我们需要 -135 度作为已排序坐标列表的“底部”。 2D 叉积的符号只能帮助确定一个向量是否顺时针指向另一个向量,但不能帮助确定向量与“底部”(即 -135 度)的距离。
标签: python sorting math coordinates