根据顺时针点坐标排序

joh*_*doe 9 python sorting math coordinates

给定一个包含8个x,y坐标值(全部为正)的4个点的列表[x1, x2, x3, x4, y1, y2, y3, y4]((xi, yi)是第i个点的x和y坐标),

我如何对它进行排序,使得新列表[a1, a2, a3, a4, b1, b2, b3, b4](ai, bi)1 2 3 4的坐标顺时针顺序,其中1最接近xy平面的原点,即类似

          2--------3
          |        |
          |        |
          |        |
          1--------4
Run Code Online (Sandbox Code Playgroud)

点将粗略地形成平行四边形.

目前,我正在考虑找到最小值为(x + y)为1的点,然后用剩余坐标中x最小的点为2,用(x + y)的最大值为3,剩余点为4

blh*_*ing 7

您应该使用两项元组列表作为数据结构,以有意义的方式表示可变数量的坐标.

from functools import reduce
import operator
import math
coords = [(0, 1), (1, 0), (1, 1), (0, 0)]
center = tuple(map(operator.truediv, reduce(lambda x, y: map(operator.add, x, y), coords), [len(coords)] * 2))
print(sorted(coords, key=lambda coord: (-135 - math.degrees(math.atan2(*tuple(map(operator.sub, coord, center))[::-1]))) % 360))
Run Code Online (Sandbox Code Playgroud)

这输出:

[(0, 0), (0, 1), (1, 1), (1, 0)]
Run Code Online (Sandbox Code Playgroud)

  • 您能解释一下这个解决方案吗? (2认同)