簡體   English   中英

如何將 0 到 +Pi 到 -Pi 到 0 范圍內的角度排序為線性范圍?

[英]How to sort angles in the range 0 to +Pi to -Pi to 0 as a linear range?

我正在嘗試解決將 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 范圍。 但是那個解決方案被拒絕了。 所以我現在一直想弄清楚如何在不將其轉換為不同范圍的情況下對其進行排序

創建自定義比較 function 並將其傳遞給sort /使用functools.cmp_to_key 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM