我有這個函式可以在笛卡爾平面中找到光線的方向:
def direction(self):
if 180 > self.angle > 90:
return (-1, 1)
elif 90 > self.angle > 0:
return ( 1, 1)
elif 0 > self.angle > -90:
return ( 1, -1)
elif -90 > self.angle > -180:
return (-1, -1)
這看起來有點笨重。有沒有更簡單的表達方式?它只是根據角度為我提供光線所經過的象限。
uj5u.com熱心網友回復:
如果您使用math.copysign和 基本三角函式,則根本不需要條件陳述句:
from math import copysign, sin, cos, pi
def direction(angle):
angle *= pi / 180
return copysign(1, cos(angle)), copysign(1, sin(angle))
如果您堅持使用條件,則可以將比較分為兩種而不是四種情況:
def direction(angle):
angle %= 360
x = -1 if 90 < angle < 270 else 1
y = -1 if 180 < angle else 1
return x, y
事實上,您可以使用作為bool的子類的事實int以不同的方式完全洗掉條件:
def direction(angle):
angle %= 360
x = 1 - 2 * (90 < angle < 270)
y = 1 - 2 * (180 < angle)
return x, y
使用像sin,cos和 modulo ( %)這樣的回圈函式將使您的代碼更好地處理環繞。
這些公式也可以更好地處理極端情況。您的原始函式將回傳None的角度90。這兩個版本不會。您可以調整條件(例如<,<=有時替換為),使邊角案例精確地按照您想要的方式作業。
uj5u.com熱心網友回復:
對我來說看起來不錯,您可以像這樣用 else 替換最后一個 elif
def direction(self):
if 180>self.angle>90:
return (-1, 1)
elif 90>self.angle>0:
return (1,1)
elif 0>self.angle>-90:
return (1,-1)
else:
return (-1,-1)
uj5u.com熱心網友回復:
您可以將角度轉換為象限數(0、1 等)并使用例如陣列中的索引:
return [(1,1), (-1,1), (-1,-1), (1,-1)]\\
[int(self.angle % 360) // 90]
即使self.angle不是整數,這也有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/316356.html
