You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将0~+Pi、-Pi~0范围的角度按连续线性序列排序?

角度排序解决方案([-Pi, Pi]范围连续线性排序)

核心排序逻辑

要实现从0开始顺时针遍历一圈的连续序列,无需转换为0~2Pi范围,可按以下规则拆分排序:

  • 将角度分为两组:
    1. 非负角度组:包含所有θ ∈ [0, Pi]的角度,按角度值从小到大排序
    2. 负角度组:包含所有θ ∈ (-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 15:00:46