#include <stdio.h>
    #include <math.h>
    #define PI 3.141593

    // prototype of function to find the great circle distance between two points
        double gc_dist(double, double, double, double);
        int main(void) 
        {
            double lat1, long1, lat2, long2;

            printf("Enter latitude north and longitude west ");
            printf("for location 1 : ");
            scanf("%lf %lf", &lat1, &long1);

            printf("Enter latitude north and longitude west ");
            printf("for location 2 : ");
            scanf("%lf %lf", &lat2, &long2);

            printf("Great Circle Distance: %.0f km\n", gc_dist(lat1, long1, lat2, long2));
        }

        double gc_dist(double lat1, double long1, double lat2, double long2) 
        {
            double rho = 6371, phi, theta, gamma, dot, dist1, dist2, x1,y1,z1,x2,y2,z2;
        phi = (90 - lat1) * (PI/180.0); // convert to spherical coordinates
        theta = (360 - long1) * (PI/180.0);
        x1 = rho * sin(phi) * cos(theta); // find rectangular coordinates for p1
        y1 = rho * sin(phi) * sin(theta);
        z1 = rho * cos(phi);
        phi = (90 - lat2) * (PI/180.0); // repeat for p2
        theta = (360 - long2) * (PI/180.0);
        x2 = rho * sin(phi) * cos(theta);
        y2 = rho * sin(phi) * sin(theta);
        z2 = rho * cos(phi);
        dot = x1 * x2 + y1 * y2 + z1 * z2; // find the dot product of the two vectors
        dist1 = sqrt(x1 * x1 + y1 * y1 + z1 * z1); // find length of each vector
        dist2 = sqrt(x2 * x2 + y2 * y2 + z2 * z2);
        gamma = acos(dot / (dist1 * dist2));
        return gamma * rho;
        }

This is what the above code does:

  1. Get coordinates of two points.
    a) Print “Enter latitude + longitude of first point”
    b) Read in coordinates; and repeat for second point.
  2. Find their distance.
    a) Find spherical coordinates and convert to
    rectangular coordinates for both points.
    b) Find the dot-product and length of both vectors.
    c) central_angle = acos(dot-product/(length of p1*length of p2))
    d) Answer is central_angle multiplied by radius of the earth.
  3. Print the great circle distance

In the case whereby the 1st point's coordinates are 36.12 86.67 and teh 2nd point's coordinates are 33.94 118.40,this is what shows up on teh console box:

Enter latitude north and longitude west for location 1 : 36.12 86.67
Enter latitude north and longitude west for location 2 : 33.94 118.40
Great Circle Distance: 2886 km

However, when i modified the program using a 'more modular' version, I managed to get the same answer for a certain point as using the above code.But i was unable to get 2886 when i used the same coordiantes (36.12 86.67) and (33.94 118.40).can soemone help me and tell me why is this so?here is the modified program>>>

#include <stdio.h>
    #include <math.h>
    #define PI 3.141593

        double gc_dist(double, double, double, double);
        int main(void) 
        {
            double lat1, long1, lat2, long2;

            printf("Enter latitude north and longitude west ");
            printf("for location 1 : ");
            scanf("%lf %lf", &lat1, &long1);

            printf("Enter latitude north and longitude west ");
            printf("for location 2 : ");
            scanf("%lf %lf", &lat2, &long2);

            printf("Great Circle Distance: %.0f km\n", gc_dist(lat1, long1, lat2, long2));
        }

    #define deg_to_rad(deg) ((deg * (PI/180.0))

    double angle(double x1, double y1, double z1, double x2, double y2, double z2);

    {
        double dot, dist1, dist2;
        dot = x1 * x2 + y1 * y2 + z1 * z2; // the dot product of the two vectors
        dist1 = sqrt(x1 * x1 + y1 * y1 + z1 * z1); // length of each vector
        dist2 = sqrt(x2 * x2 + y2 * y2 + z2 * z2);
        return acos(dot / (dist1 * dist2));
    }

    double gc_dist(double lat1, double long1, double lat2, double long2) 
    {
        double rho = 6371, phi, theta, gamma, dot, dist1, dist2, x1,y1,z1,x2,y2,z2;
        phi = deg_to_rad(90 - lat1)); // convert to spherical coordinates
        theta = deg_to_rad(360 - long1));
        x1 = rho * sin(phi) * cos(theta); // find rectangular coordinates for p1
        y1 = rho * sin(phi) * sin(theta);
        z1 = rho * cos(phi);
        phi = deg_to_rad(90 - lat2)); // find rectangular coordinates for p2
        theta = deg_to_rad(360 - long2));
        x2 = rho * sin(phi) * cos(theta);
        y2 = rho * sin(phi) * sin(theta);
        z2 = rho * cos(phi);
        return angle(x1, y1, z1, x2, y2, z2) * rho;
    }

whats my mistake and how shoud i edit it??

Edited 3 Years Ago by happygeek: fixed formatting

after 19 line int main function must return a value . u can solve it by placing the statement return(0).
at line 23, angle function defination does not has semicollon(;). this function must has prototype which defined before main function as double angle(double,double,double,double,double,double);

In addition to post 2, you still have problems. I'm not entirely sure what they are, but if x1, x2, y1, y2, z1, and z2 are supposed to be the same values at the end of the first function as they are at the end of the second function, they definitely are not. I would take the first function, which presumably is correct, and go through it step by step, doing ONE change at a time, recompiling and running it each time till you end up with a problem. Right now, you have too many things going on, so it's hard to backtrack. So do a complete copy and paste, change it one line at a time, see where you come up with the error.

Edited 7 Years Ago by VernonDozier: n/a

This article has been dead for over six months. Start a new discussion instead.