如何将0~+Pi、-Pi~0范围的角度按连续线性序列排序?
角度排序解决方案([-Pi, Pi]范围连续线性排序)
核心排序逻辑
要实现从0开始顺时针遍历一圈的连续序列,无需转换为0~2Pi范围,可按以下规则拆分排序:
- 将角度分为两组:
- 非负角度组:包含所有
θ ∈ [0, Pi]的角度,按角度值从小到大排序 - 负角度组:包含所有
θ ∈ (-Pi, 0)的角度,按角度值从小到大排序(等价于绝对值从大到小)
- 非负角度组:包含所有
- 最终结果为「非负排序组」拼接「负排序组」
验证示例
以你提供的输入为例:
- 输入案例1的非负角度:
Pi/4, 0, Pi/2, Pi, 3*Pi/4→ 排序后:0, Pi/4, Pi/2, 3*Pi/4, Pi - 输入案例1的负角度:
-Pi/20, -Pi/4, -Pi, -3*Pi/4, -Pi/2, -Pi/10→ 排序后:-Pi, -3*Pi/4, -Pi/2, -Pi/4, -Pi/10, -Pi/20 - 拼接后完全匹配预期输出
代码实现示例(Python)
import math def sort_angles(angles): # 拆分非负和负角度组 non_neg = [theta for theta in angles if theta >= 0] negative = [theta for theta in angles if theta < 0] # 分别排序 non_neg_sorted = sorted(non_neg) negative_sorted = sorted(negative) # 拼接返回 return non_neg_sorted + negative_sorted # 测试案例1 case1 = [math.pi/4, 0, math.pi/2, -math.pi/20, math.pi, -math.pi/4, -math.pi, -3*math.pi/4, 3*math.pi/4, -math.pi/2, -math.pi/10] print([round(theta, 4) for theta in sort_angles(case1)]) # 输出近似值:[0.0, 0.7854, 1.5708, 2.3562, 3.1416, -3.1416, -2.3562, -1.5708, -0.7854, -0.3142, -0.1571]
逻辑说明
这种排序方式本质是利用了[-Pi, Pi]区间的特性:从0顺时针到Pi后,下一个连续角度就是-Pi(与Pi在圆周上重合),随后继续顺时针遍历到接近0的最小负数(如-Pi/20)。整个过程完全保留原角度的正负区间,无需额外转换,满足性能要求。
内容的提问来源于stack exchange,提问作者Arun Kumar
相关产品推荐
相关产品推荐

