风向相对于旅行

时间:2014-05-20 00:32:07

标签: python function vector

我正在尝试建立一个功能,以便在风向前,我可以获得相对于行进方向的风向。我提供了一个很长的路要走的例子。它感觉臃肿而且很简陋。

我遇到了麻烦,因为风是基于矢量的,我需要找到一种方法来评估函数,同时考虑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)

3 个答案:

答案 0 :(得分:4)

  1. 你选择的角度有点奇怪:

    enter image description here

    首先勾勒出你的角度应该是什么样子,这可能是一个好主意;以轴为中心的象限边界将分别为45度,135度,225度和315度。

  2. 我建议你制作一个能够使你的航向和风向并返回相对风向的功能,而不是使用硬编码的航向:

    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运算符将结果固定在所需的范围内。

  3. 您现在可以编写类似

    的功能
    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;一个特定的角度:

  • 0度,1-179是&#34;右边&#34;和181-359在左边&#34;
  • 15度,16-194是#34;右边&#34;和196-374在左边&#34; (看!角度> 360!)
  • 等...

您会注意到这与我答案的第一部分中wind_head_boundaries示例的问题非常相似。

答案 2 :(得分:1)

您需要找到方向mod 360之间的差异。在Python中,使用%运算符。

diff = (angle1 - angle2) % 360 # (0 - 45) % 360 = 315