Questo fine settimana trascorro alcuni minuti mescolando insieme un algoritmo che dovrebbe contenere un titolo (in gradi) e restituire una stringa per la direzione cardinale (la sto usando in un'applicazione della bussola Android I ' m usando). Quello che ho finito è stato questo:Algoritmo di direzione cardinale in 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;
}
La mia domanda è, è questo il modo migliore di farlo? Deve essere stato fatto molte volte prima sebbene non abbia ancora fatto una ricerca di esempi sul web. Qualcun altro ha provato questo e ha trovato una soluzione più pulita?
Edit per le risposte, shinjin di e Chrstoffer'S del Reverendo Thilo:
La soluzione
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. Molto bella. Facendo questo un ulteriore passo, aggiungi un'altra piccola conversione alla funzione e lui può semplicemente ottenere un indice in una matrice di stringhe: 'String [] directions = {" N "," NE "," E "...}' – Thilo
Se ometti la moltiplicazione per 45, puoi utilizzare una matrice semplice invece di una mappa hash. – shinjin
È necessaria una "N" aggiuntiva in quella matrice. Intestazioni 337.5 e successive arrotonderanno a 8. –