将学位转换为象限名称的最佳方法是什么
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);
例如,如果输入为 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);