Este fin de semana paso unos minutos combinando un algoritmo que tomaría un rumbo (en grados) y devolvería un String para la dirección cardinal (lo estoy usando en una aplicación de brújula Android I ' m usando). Lo que terminé con esto fue esto:Algoritmo de dirección cardinal en Java
private String headingToString(Float heading)
{
String strHeading = "?";
Hashtable<String, Float> cardinal = new Hashtable<String, Float>();
cardinal.put("North_1", new Float(0));
cardinal.put("Northeast", new Float(45));
cardinal.put("East", new Float(90));
cardinal.put("Southeast", new Float(135));
cardinal.put("South", new Float(180));
cardinal.put("Southwest", new Float(225));
cardinal.put("West", new Float(270));
cardinal.put("Northwest", new Float(315));
cardinal.put("North_2", new Float(360));
for (String key: cardinal.keySet())
{
Float value = cardinal.get(key);
if (Math.abs(heading - value) < 30)
{
strHeading = key;
if (key.contains("North_"))
{
strHeading = "North";
}
break;
}
}
return strHeading;
}
Mi pregunta es, ¿es esta la mejor manera de hacerlo? Debe haber sido hecho muchas veces antes aunque todavía no he hecho una búsqueda de ejemplos en la web. ¿Alguna otra persona ha intentado esto y ha encontrado una solución más ordenada?
de edición para las respuestas, shinjin de Chrstoffer y de la del Reverendo Thilo:
La solución
public static String headingToString2(double x)
{
String directions[] = {"N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"};
return directions[ (int)Math.round(( ((double)x % 360)/45)) ];
}
+1. Muy agradable. Llevando esto un paso más allá, agregue otra conversión pequeña a la función y él puede simplemente obtener un índice en una matriz de cadenas: 'String [] directions = {" N "," NE "," E "...}' – Thilo
Si omites la multiplicación por 45, entonces puedes usar una matriz simple en lugar de un mapa hash. – shinjin
Necesita una "N" adicional en esa matriz. Encabezados 337.5 y más se redondeará a 8. –