将学位转换为象限名称的最佳方法是什么

What is the best way to Convert Degrees to Quadrant Names

例如,如果输入为 22.5 度,则输出将为“North East

像往常一样,"best"取决于context/requirements。

A "low level" 解决方案是:您实际上想要将“360 度”映射到“16 个不同的 类”。这真的很简单:将学位值除以 16;然后使用从中获得的四舍五入数字作为字符串数组中的索引,该数组包含相应的 "names" 方向(加上一些按摩以获得 0 度和 360 度的相同结果)。

示例:21 度/16 --> 1.3 四舍五入为 1

该数组中的第一个条目是 "N" ...所以你去吧。

但如前所述,这是一个非常低级的解决方案;如果你想要未来承载你的东西,并且changing/extended要求;您最好创建所涉及概念的真正 OO 抽象。也许你不会将那些 "directions" 表示为简单的字符串,也许你真的有 类 表示度数,而 类 表示 "directions".

地图会很好:

    import java.util.LinkedHashMap;
    import java.util.Map;

    /**
     * Convert degrees to heading names
     * User: mduffy
     * Date: 7/21/2016
     * Time: 7:49 AM
     * @link 
     */
    public class HeadingConverter {

        private static final Map<Double, String> DEGREES_TO_HEADING;

        // TODO: You need to add more to the Map
        static {
            DEGREES_TO_HEADING = new LinkedHashMap<Double, String>() {{
                put(0.0, "E");
                put(90.0, "N");
                put(180.0, "W");
                put(270.0, "S");
                put(360.0, "E");
            }};
        }

        public static void main(String[] args) {
            for (String arg : args) {
                double unnormalized = Double.parseDouble(arg);
                System.out.println(String.format("angle: %10.3f heading: %s", unnormalized, HeadingConverter.getHeading(unnormalized)));
            }
        }

        public static double normalizeDegrees(double unnormalized) {
            // TODO: For you to complete
            return unnormalized;
        }

        public static String getHeading(double unnormalized) {
            String heading = "UNKNOWN";
            double normalized = normalizeDegrees(unnormalized);
            for (Double angle : DEGREES_TO_HEADING.keySet()) {
                if (normalized <= angle) {
                    heading = DEGREES_TO_HEADING.get(angle);
                    break;
                }
            }
            return heading;
        }
    }

最佳”转换方式是将度数四舍五入到下一个象限,这当然取决于 你的指南针有多少方位角...

让我们暂时假设您只有 4 个北、南、西和东,

然后尝试转换 180° 将与南方完全匹配(假设北方为 0°=360°),但我希望 200° 也指向南方,因为它更接近那个方向而不是西...

160° 的标准相同,因为比东更靠近南

解决方案

定义枚举

基点

  enum CPoint {
        NORTH,
        EAST,
        SOUTH,
        WEST
    }
    
    
    and test it like:
    
        public static void main(String[] args) {
        final int divisor = 360 / CPoint.values().length;
        for (int i = 0; i < 360; i++) {
            final int coci = i / divisor;
            final int resto = i % divisor;
            if (resto <= divisor / 2) {
                System.out.println(i + "--->" + CPoint.values()[coci % CPoint.values().length]);
            } else {
                System.out.println(i + "--->" + CPoint.values()[(coci + 1) % CPoint.values().length]);

            }
        }
    }

输出将显示循环如何将 i 的值四舍五入到最接近的基数点

这个方法最好的部分是你可以定义一个方法,它接受一个整数作为参数,returns一个基数点的枚举常量...

然后你可以做一些不错的事情,比如 switch-case 或类似的东西:-)

我需要这个天气功能。因为我没有发现任何令人满意的东西,所以这可能是 java 一个 class 的实施,它需要一个学位和 returns 8 个方向之一。它并不精确,因为它用于在显示一般天气时显示风向。可以改进这一点...

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

public class DegreeToQuadrant {

    List<QuadrantItem> quadrants;
    String[] QuadrantNames = new String[]{"N", "NE", "E", "SE", "S", "SW", "W", "NW"};

    DegreeToQuadrant() {
        double leftValue = 360 - 22.5;
        double rightValue = 22.5;
        double step = 45;
        quadrants = new ArrayList<QuadrantItem>();
        for (String qname : QuadrantNames) {
            QuadrantItem quadrantItem = null;
            if (qname == "N")
                quadrantItem = new QuadrantItem(qname, leftValue, rightValue, "or");
            else {
                leftValue = rightValue;
                rightValue = leftValue + step;
                quadrantItem = new QuadrantItem(qname, leftValue, rightValue, "and");
            }
            quadrants.add(quadrantItem);
        }
    }

    String getQuadrantName(double degree) {
        for (QuadrantItem quadrantItem : quadrants)
            if (quadrantItem.isIn(degree))
                return quadrantItem.m_quadrantName;
        return "";
    }

    public static class QuadrantItem {
        String m_quadrantName;
        String m_operation; //or , and
        double m_left;
        double m_right;
        HashMap<String, QuadrantItem> quadrants;

        QuadrantItem(String name, double left, double right, String operation) {
            m_quadrantName = name;
            m_operation = operation;
            m_left = left;
            m_right = right;
        }

        boolean isIn(double degree) {
            if (m_operation == "and")
                return degree > m_left && degree < m_right;
            else
                return degree > m_left || degree < m_right;
        }
    }

}

注意:对于N值(北),操作应该是degree>leftLimit OR degree < rightLimit。这与其他切片不同,其度数需要在两个限制之间。

使用方法: 以wind_deg为风度,得到要显示的象限:

DegreeToQuadrant degreeConvertor = new DegreeToQuadrant();
String quadrantName = degreeConvertor.getQuadrantName(wind_deg);