2011-03-05 14 views
9

Necesito implementar la distancia Harvesine en mi código java.Java: preguntas sobre radianes, Math.cos, Math.sin, double y long

Encontré este fragmento en Javascript, y necesito convertirlo a Java.

  1. ¿Cómo puedo convertir la latitud y la longitud a radianes en Java?
  2. Math.sin quiere un doble en Java. ¿Debo pasar el valor previamente convertido en radianes o no?
  3. Math.sin y Math.cos regresan de largo. ¿Debo declarar un tiempo igual y pasarlo a Math.sqrt o convertirlo a double?

gracias

dLat = (lat2-lat1).toRad(); 
dLon = (lng2-lng1).toRad(); 
a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
    Math.cos(lat1.toRad()) * Math.cos(lat2.toRad()) * 
    Math.sin(dLon/2) * Math.sin(dLon/2); 
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
d = R * c; 
return d; 

Respuesta

5
  1. Si tiene valor en grados, simplemente lo hacen degrees * Math.PI/180. O mejor uso de la función sugerida por coobird en el comentario (no lo conocía).
  2. Sí, puede pasar cualquier valor doble en él. (Cualquier número, para el caso).
  3. No, ambas funciones toman el parámetro double. Compruebe the docs.
+5

Para (1), usando 'Math.toRadians (grados)' sería más fácil de leer. – coobird

+0

@coobird Gracias, actualizado. –

7

En primer lugar, debe leer el javadoc. sin(double) toma un double en el parámetro que es el ángulo en radianes como se dice en la documentación. También encontrará en la página vinculada que sqrt también tiene un doble.

Entonces, debe saber que Java puede realizar conversiones no destructivas automáticamente. Entonces, si un método toma un doble y tiene un largo, no será problema, ya que no hay pérdida en la conversión larga -> doble. Lo contrario es falso, por lo que Java rechaza la compilación ton.

Para la conversión de radianes, encontrará un método toRadians en la clase de matemáticas.

+2

Puede haber una pérdida en la conversión larga-> doble. Por ejemplo, si el valor largo es un número impar por encima de 2^53 (o por debajo de -2^53), no se puede representar exactamente como un valor doble. Por alguna razón, el JLS elige ignorar estas pérdidas de conversión y considera esta conversión como una conversión de ampliación. (Mismo problema para int-> float y long-> float - aquí el límite es 2^24.) –

+0

Gracias por el comentario, no sabía de esto. – krtek

+0

Patrick nunca lee la documentación por nada, en su lugar, pregunta aquí en SO. –