如何在0到+Pi到-Pi到0的范围内排序角度作为线性范围?



我正试图解决在0到+Pi弧度和+Pi到-Pi到0弧度范围内排序角度的问题,作为一个连续范围。我知道这可能很难理解。让我在下面引用一个例子。

下面是我希望在对一组混乱的角度进行排序后得到的最终范围的示例:

Example Inputs
Case - 1: Pi/4, 0, Pi/2, -Pi/20, Pi, -Pi/4, -Pi, -3*Pi/4, 3*Pi/4, -Pi/2, -Pi/10
Case - 2: -Pi/20, Pi/2, Pi, -Pi/2, -Pi/10, -Pi/4, Pi/4, 0,-Pi, -3*Pi/4, 3*Pi/4
Expected Output
0, Pi/4, Pi/2, 3*Pi/4, Pi, -Pi, -3*Pi/4, -Pi/2, -Pi/4, -Pi/10, -Pi/20

从上面的列表(预期输出)中可以看到,排序后的列表基本上代表了一个圆中连续的角度范围(从0开始,进行完整的360度旋转,以0结束)。

如果这些数字只是在0到360的范围内,就很容易排序。但是,当范围像这样分成正负角度时,它就变得棘手了。

额外信息:出于某种奇怪的性能原因,我不允许将这个角度转换为0到2Pi的范围进行排序。排序时必须保留范围。我的第一个解决方案是使用(theta + 2pi) % (2*pi)将其转换为2pi范围。但是这个解决方案被拒绝了。所以我现在一直在努力弄清楚如何在不将其转换为不同范围的情况下对其进行排序

创建一个自定义比较函数,并使用functools.cmp_to_key:

将其传递给sort/sorted:
def angle_compare(a, b):
def cmp(a, b):
return (a > b) - (b > a)
if (a < 0) == (b < 0):  # both positive or both negative
return cmp(a, b)
return cmp(b, a)
>>> Pi = 3.14
>>> l1 = [Pi/4, 0, Pi/2, -Pi/20, Pi, -Pi/4, -Pi, -3*Pi/4, 3*Pi/4, -Pi/2, -Pi/10]
>>> sorted(l1, key=functools.cmp_to_key(angle_compare))
[0, 0.785, 1.57, 2.355, 3.14, -3.14, -2.355, -1.57, -0.785, -0.314, -0.157]
from numpy import * 
a  = np.array([-pi/4.,0,pi/2., -pi/20., pi, -pi/4., -pi, -3*pi/4., 3*pi/4., -pi/2., -pi/10.])
b = a*180.0/pi
for i, val in enumerate(b):
if val < 0: b[i] += 360
c = np.sort(b)
d = c* pi / 180.
for i in range(len(d)):
if d[i] > pi: d[i] -= 2*pi

最新更新