将风向转换为文本词

zac*_*oni 34 angle

我有来自风向标的风向数据,数据以0到359度表示.

我想将其转换为16种不同方向的文本格式(罗盘).

基本上我想知道是否有一种快速光滑的方式将角度读数缩放到16弦阵列以打印出正确的风向而不使用一堆if语句并检查角度范围

风向可以在这里找到.

谢谢!

ste*_*ory 69

编辑:

由于每22.5度有一个角度变化,方向应在11.25度后交换手.

因此:

349-360//0-11 = N
12-33 = NNE
34-56 = NE
Run Code Online (Sandbox Code Playgroud)

使用327-348(整个NNW谱)中的值未能产生eudoxos回答的结果.在给它一些想法之后我找不到他的逻辑中的缺陷,所以我重写了我自己的..

def degToCompass(num):
    val=int((num/22.5)+.5)
    arr=["N","NNE","NE","ENE","E","ESE", "SE", "SSE","S","SSW","SW","WSW","W","WNW","NW","NNW"]
    print arr[(val % 16)]

>>> degToCompass(0)
N
>>> degToCompass(180)
S
>>> degToCompass(720)
N
>>> degToCompass(11)
N
>>> 12
12
>>> degToCompass(12)
NNE
>>> degToCompass(33)
NNE
>>> degToCompass(34)
NE
Run Code Online (Sandbox Code Playgroud)

脚步 :

  1. 将角度除以22.5,因为360度/ 16方向= 22.5度/方向变化.
  2. 添加.5以便在截断值时可以打破更改阈值之间的"平局".
  3. 使用整数除法截断值(因此没有舍入).
  4. 直接索引到数组并打印值(mod 16).


Mat*_*ear 27

这是steve-gregory的答案的javascript实现,对我有用.

function degToCompass(num) {
    var val = Math.floor((num / 22.5) + 0.5);
    var arr = ["N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"];
    return arr[(val % 16)];
}
Run Code Online (Sandbox Code Playgroud)

请参阅他的答案以解释逻辑.


eud*_*xos 11

注意舍入,349 ... 11之间的角度应为"N",因此首先添加半扇区(+(360/16)/ 2),然后处理溢出超过360%360,然后除以360/16:

["N","NNW",...,"NNE"][((d+(360/16)/2)%360)/(360/16)]
Run Code Online (Sandbox Code Playgroud)


Edw*_*rey 7

这个 JavaScript 将适用于任何只需要 8 个基本方向并想要相应箭头的人。

function getCardinalDirection(angle) {
    const directions = ['? N', '? NE', '? E', '? SE', '? S', '? SW', '? W', '? NW'];
    return directions[Math.round(angle / 45) % 8];
}
Run Code Online (Sandbox Code Playgroud)


小智 5

我相信更容易:

  1. 将方向移动 11.25
  2. 在方向列表末尾添加“N”以处理“超过 360”,

DirTable = ["N","NNE","NE","ENE","E","ESE", "SE","SSE","S","SSW","SW","WSW", "W","WNW","NW","NNW",**"N"**]; 

wind_direction= DirTable[Math.floor((d+11.25)/22.5)];
Run Code Online (Sandbox Code Playgroud)


小智 5

我检查了一下,它的效果很好,看起来很准确。资料来源:艾德里安·史蒂文斯(Adrian Stevens)的http://www.themethodology.net/2013/12/how-to-convert-degrees-to-cardinal.html

    public static string DegreesToCardinal(double degrees)
    {
        string[] caridnals = { "N", "NE", "E", "SE", "S", "SW", "W", "NW", "N" };
        return caridnals[(int)Math.Round(((double)degrees % 360) / 45)];
    }

    public static string DegreesToCardinalDetailed(double degrees)
    {
        degrees *= 10;

        string[] caridnals = { "N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE", "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW", "N" };
        return caridnals[(int)Math.Round(((double)degrees % 3600) / 225)];
    }
Run Code Online (Sandbox Code Playgroud)