Search code examples
javagreat-circle

Incorrect output when computing the distance in kilometres of the Great Circle using Haversine formula in Java


I'm trying to compute the distance in kilometres of the Great Circle using Haversine formula in Java as shown below

/* Program to demonstrate the Floating-point numbers and the Math library.
 * The great-circle distance is the length of the shortest path between two points (x1,y1) and (x2,y2) on the surface of a sphere, where the path is constrained to be along the surface.*/
public class GreatCircle 
{
    public static void main(String[] args) 
    {
        double r = 6371.0; // Equatorial radius of the Earth
        double x1 = Math.toRadians(Double.parseDouble(args[0]));
        double y1 = Math.toRadians(Double.parseDouble(args[1]));
        double x2 = Math.toRadians(Double.parseDouble(args[2]));
        double y2 = Math.toRadians(Double.parseDouble(args[3]));

        // Compute using Haversine formula
        double distance = 2 * r * Math.asin(Math.sqrt(Math.pow(Math.sin((x2 - x1) / 2),2 + Math.cos(x2) * Math.pow(Math.sin((y2 - y1) / 2),2)));

        // Output the distance
        System.out.println(distance + " kilometers ");
    }
}

I'm running with input java GreatCircle 60.0 15.0 120.0 105.0. The expected output is 4604.53989281927 kilometers, But I get 13406.238676180266 kilometers. Could someone please point out where am I going wrong?


Solution

  • The formula was implemented incorrectly. It worked after making the following corrections. In the formula, we are taking the arc sin of the entire expression.

    
            // Compute using Haversine formula
            double distance = 2 * r * Math.asin(Math.sqrt(Math.pow(Math.sin((x2 - x1) / 2),2 + Math.cos(x2) * Math.pow(Math.sin((y2 - y1) / 2),2)));
    
            // Output the distance
            System.out.println(distance + " kilometers ");
        }
    }