2010-07-28 54 views
-4

在我開始感謝每個人之前。獲取角度在-180到+180之間

通過我的應用程序s/w我會閱讀syncro值將在角度。 當我運行Python腳本時,值被收集在特定的變量中。

假設範圍爲-180至180

而且我得到了角-180。根據要求它應該是+/- 1度窗口;即;在179和-179之間。

我該如何檢查它是否落入該範圍?

angle = -180 
tolerance = 1 (in degree) 
if(180-1) <= -180 <= (-180+1): 
     # statements 



angle1 = -179 
tolerance = 1 
if(-170-1)<= -179 <= (-179+1): 
     # statements 



angle2 = 179 
tolerance = 1 
if(179-1) <= 179 <= (179+1): 
     # statements 

這將適用於所有角度組合嗎?你怎麼看 ?

+4

http://docs.python.org/library/stdtypes.html#index-600 – 2010-07-28 09:00:07

+1

-1:「假設範圍是-180到180.」該代碼應符合要求。這是什麼?爲什麼這很複雜? – 2010-07-28 10:29:35

+0

請檢查我的答案,如果這是你需要的,請相應地編輯你的問題以說清楚,或者我可以爲你做;只是問。 – tzot 2010-08-27 07:42:59

回答

1
if -180 < x < 180: 
    #do something 

這包括-179和範圍內的179,而不是-180和180

+0

-180和180在同一點重合。 – user46646 2010-07-28 09:09:21

+3

但python不知道。如果這個解決方案不符合你的要求,你將不得不更加清楚地重申它們。 – 2010-07-28 09:13:35

+0

上述組合是否可以工作? – user46646 2010-07-28 09:21:35

0

如果我理解正確的話,你必須要確保他們接近某些角度目標角度,給定一個特定的公差來定義接近度。我認爲這是你需要的:

def restrict_angle(angle): 
    "make sure any angle falls in the [0..360) range" 
    return angle % 360 

def is_angle_almost(angle, target_angle, tolerance): 

    tolerance= abs(tolerance) # same meaning, easier logic 

    angle= restrict_angle(angle) 
    upper_limit= restrict_angle(target_angle + tolerance) 
    lower_limit= restrict_angle(target_angle - tolerance) 

    if upper_limit < lower_limit: # when target_angle close to -180 
     upper_limit+= 360 

    return (lower_limit <= angle <= upper_limit 
     or lower_limit <= angle + 360 <= upper_limit) 

if __name__ == "__main__": 
    for test in (
     ((90, 92, 3), True), 
     ((90, 92, -3), True), 
     ((90, 92, -1), False), 
     ((180, 181, 1), True), 
     ((180, 182, 1), False), 
     ((179, -180, 1), True), 
     ((-175, 180, 6), True), 
     ((-175, 180, 4), False), 
     ((4, 0, 5), True), 
    ): 
     if is_angle_almost(*test[0]) != test[1]: 
      print ("fails for " + str(test[0])) 
      break 
    else: 
     print "all tests successful" 

你將使用的功能是is_angle_almost