我正在尝试建立一个功能,以便在风向前,我可以获得相对于行进方向的风向。我提供了一个很长的路要走的例子。它感觉臃肿而且很简陋。
我遇到了麻烦,因为风是基于矢量的,我需要找到一种方法来评估函数,同时考虑360deg圈。
def relative_wind(wind_heading, rider_heading):
if 320 < wind_heading < 60:
wind_direction = 'north'
elif 140 > wind_heading > 60:
wind_direction = 'east'
elif 230 > wind_heading > 140:
wind_direction = 'south'
else:
wind_direction = 'west'
if 320 < rider_heading < 60:
rider_direction = 'north'
elif 140 > rider_heading > 60:
rider_direction = 'east'
elif 230 > rider_heading > 140:
rider_direction = 'south'
else:
rider_direction = 'west'
if rider_direction == 'north':
if wind_direction == 'north':
relative_direction = 'tail'
elif wind_direction == 'east':
relative_direction = 'right'
elif wind_direction == 'south':
relative_direction = 'head'
else:
relative_direction = 'left'
return relative_direction
elif rider_direction == 'east':
if wind_direction == 'north':
relative_direction = 'left'
elif wind_direction == 'east':
relative_direction = 'tail'
elif wind_direction == 'south':
relative_direction = 'right'
else:
relative_direction = 'head'
return relative_direction
elif rider_direction == 'west':
if wind_direction == 'north':
relative_direction = 'right'
elif wind_direction == 'east':
relative_direction = 'head'
elif wind_direction == 'south':
relative_direction = 'left'
else:
relative_direction = 'tail'
return relative_direction
else:
if wind_direction == 'north':
relative_direction = 'head'
elif wind_direction == 'east':
relative_direction = 'left'
elif wind_direction == 'south':
relative_direction = 'tail'
else:
relative_direction = 'right'
return relative_direction
print relative_wind(285, 285)
答案 0 :(得分:4)
你选择的角度有点奇怪:
首先勾勒出你的角度应该是什么样子,这可能是一个好主意;以轴为中心的象限边界将分别为45度,135度,225度和315度。
我建议你制作一个能够使你的航向和风向并返回相对风向的功能,而不是使用硬编码的航向:
def relative_wind_direction(heading, wind_dir):
"""
Return wind direction relative to plane heading, in [-180..180) degrees
"""
return ((wind_dir - heading + 180) % 360) - 180
正如@sjy所建议的那样,它使用%
mod运算符将结果固定在所需的范围内。
您现在可以编写类似
的功能def wind_aspect(heading, wind_dir):
rel_dir = relative_wind_direction(heading, wind_dir)
if rel_dir < -135:
return "head"
elif rel_dir < -45:
return "right"
elif rel_dir < 45:
return "tail"
elif rel_dir < 135:
return "left"
else:
return "head"
答案 1 :(得分:1)
考虑一下:当travel_heading为300deg时,如何在240~320之间的wind_heading是&#34; head&#34;?
考虑一下:当travel_heading为300deg时,wind_heading在60~320之间是&#34;对&#34;?
等...
您的学位界限明显取决于travel_heading
。在测试相对标题之前,您需要在函数开头定义边界,例如:
wind_head_boundaries = [travel_heading - 60, travel_heading + 20] # [240, 320]
如果travel_heading
300,则根据您的示例,您需要计算&#34; head&#34;的两个度数边界。当然,这意味着你也需要传递旅行方向。
(顺便说一句,我使用ruby语法,因为我比python更熟悉它,对不起)
修改强>
您似乎也不熟悉如何使用角度进行计算。
首先,您需要进行模运算。它允许您将所有角度转换为0到359之间的数字,例如360度相当于0度,-10度相当于350度。
接下来,您必须弄清楚如何确定&#34;到右边&#34;从&#34;到左边&#34;一个特定的角度:
您会注意到这与我答案的第一部分中wind_head_boundaries
示例的问题非常相似。
答案 2 :(得分:1)
您需要找到方向mod 360之间的差异。在Python中,使用%
运算符。
diff = (angle1 - angle2) % 360 # (0 - 45) % 360 = 315