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

标签 java

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

引用请看this图片。

这是我当前代码的示例:

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

这一系列 else if 语句以 22.5 度为间隔继续,直到涵盖所有基本方向。有没有更有效的方法来做到这一点?目前,Android Studio/IntelliJ 给出了一条错误消息,指出此方法过于复杂,无法通过数据流算法进行分析。不管错误信息如何,我认为可能有更优雅的方法来做到这一点,但我现在想不出。

有什么想法吗?谢谢!

最佳答案

整数运算是你的 friend :

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)];
}

这适用于任何正值。


如果您更喜欢更内联的方法:

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)];

关于java - 测试数字是否落在 360 度圆的某个 22.5 度范围内的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28142268/

相关文章:

java - Google Play 服务上的广告声明在 APK 中显示 Admob

java - OSGi 包与 javax.json.JsonException for MoXy

java - 在带有外国的表上选择除一列以外的所有列

java - 如何将短数组写入 DataOutputStream?

java - 用正则表达式替换 Java 中的空格和分号

java - 如何根据自定义顺序对 java 列表进行排序

java - 如何保护注册页面免受多次恶意请求?

java - JTable:改变遍历顺序

java - 如何知道多部分请求中该部分的真实内容类型是什么

java - Play Framework中获取表单数据的方法