最有效的方法来测试数字是否在360度圆的某个22.5度范围内

pez*_*pez 4 java

我正在构建一个指南针,并且需要根据用户当前所处的22.5度间隔返回基本方向的不同字符串.

作为参考,请看这张照片.

以下是我当前代码的示例:

if ((azimuth >= 348.75 && azimuth <= 360) || (azimuth >= 0 && azimuth <= 11.25))
{
    return "N";
}
else if (azimuth < 348.75 && azimuth >= 326.25)
{
    return "NNW";
}
Run Code Online (Sandbox Code Playgroud)

这一系列else if陈述以22.5度的间隔继续,直到涵盖所有基本方向.有没有更有效的方法来做到这一点?目前,Android Studio/IntelliJ正在提供错误消息this method is too complex to analyze by data flow algorithm.无论错误信息如何,我认为可能有更优雅的方式来做到这一点,但我现在想不到它.

有任何想法吗?谢谢!

Boh*_*ian 8

整数算术是你的朋友:

private static final POINTS = new String[]{
    "N", "NNE", "NE", "ENE", 
    "E", "ESE", "SE", "SSE",
    "S", "SSW", "SW", "WSW",
    "W", "WNW", "NW", "NNW"};

public static String point(int azimuth) {
    return POINTS[(int)((azimuth + 11.25) % 360 / 22.5)];
}
Run Code Online (Sandbox Code Playgroud)

这将适用于任何正面价值.


如果您更喜欢更直观的方法:

return new String[]{"N", "NNE", "NE", "ENE", "E", "ESE", "SE", "SSE",
    "S", "SSW", "SW", "WSW", "W", "WNW", "NW", "NNW"}
    [(int)((azimuth + 11.25) % 360 / 22.5)];
Run Code Online (Sandbox Code Playgroud)