如何按逆时针方向对一组包含坐标的元组列表进行排序?

4

我有一组元组列表,其中包含以(x,y)格式表示的坐标。我想按逆时针方向对其进行排序/排列。例如:

[(0,1),(3,1),(-1,0),(2,2)]

排列好的列表应该是:
[(3,1),(2,2),(0,1),(-1,0)]

注意:该列表可以有'n'个元组,且(0,0)可以是列表的一部分。

对于更通用的解决方案,您可以参考以下链接:https://dev59.com/aWsz5IYBdhLWcg3wxax3 - blhsing
1个回答

8
您可以使用双参数反正切函数来计算从(1,0)开始的角度,然后用它来进行排序:
>>> vec = [(0,1),(3,1),(-1,0),(2,2)]
>>> sorted(vec, key=lambda p: math.atan2(p[1], p[0]))  # atan2(y, x)
[(3, 1), (2, 2), (0, 1), (-1, 0)]

atan2函数

(图片来自维基百科。)


注:此图片为关于 atan2 函数的示意图。

1
只有当(0, 0)恰好是给定坐标的中心点时,此方法才有效。 - blhsing
2
@blhsing: 你有理由认为(0,0)不是OP需要的吗?如果是这样,我可以轻松地编辑答案来移动坐标系(只需在lambda函数中进行两次减法)。 - NPE
原因很简单,给定的样本点没有(0, 0)作为中心点;因此计算应该是泛化的,而不是基于(0, 0)是中心点的假设。 - blhsing
@blhsing 抱歉,你完全让我摸不着头脑。我的理解是(0, 0)恰好是以其为中心所定义的“逆时针方向”的坐标系原点。也许楼主可以确认一下?如果我的回答并没有解决问题(我认为它应该是正确的),我很乐意删除或修改回答。 - NPE
我理解逆时针排序一组坐标的方式是,当从中心点指向这些有序点的向量逆时针旋转时。现在我看到你只是假设它们总是从(0,0)指向。我想这也是一种可能的解释问题的方式,因为OP没有提供足够的细节,但我仍然认为OP更有可能是要将它们从中心点排序。 - blhsing
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接