第1个回答 2006-12-05
因为地球是椭球体,所以计算出准确的距离需要更复杂的公式。如果假设地球是球体就容易的多了,
设地球上某点的经度为lambda,纬度为phi,
则这点的空间坐标是
x=cos(phi)*cos(lambda)
y=cos(phi)*sin(lambda)
z=sin(phi)
设地球上两点的空间坐标分别为(x1,y1,z1),(x2,y2,z2)
直线距离即为R*sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)),不过没什么意义
则它们的夹角为
A=acos(x1*x2+y1*y2+z1*z2),A是角度
则两地距离为
A/180*pi*R,其中R为地球平均半径6371
误差不超过1%
第2个回答 2006-12-06
设地球上某点的经度为lambda,纬度为phi,
则这点的空间坐标是
x=cos(phi)*cos(lambda)
y=cos(phi)*sin(lambda)
z=sin(phi)
设地球上两点的空间坐标分别为(x1,y1,z1),(x2,y2,z2)
直线距离即为R*sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1)+(z2-z1)*(z2-z1)),不过没什么意义
则它们的夹角为
A=acos(x1*x2+y1*y2+z1*z2),A是角度
则两地距离为
A/180*pi*R,其中R为地球平均半径6371
误差不超过1%
第3个回答 2012-03-06
同纬度:#include <stdio.h>/*其中A代表纬度,B和C代表经度,S为所求球面距离*/
#include <math.h>
#define PI 3.1415926
main()
{
float a,b,c,s,m;
scanf("%f%f%f",&a,&b,&c);
m=fabs(b-c);
if(m<180)
s=2*6371*asin(cos(PI/180*a)*sin(PI/360*m));
else
s=2*6371*asin(cos(PI/180*a)*sin(PI/360*(360-m)));
printf("距离为%f\n",s);
}
不同纬度不同经度:/*A(a1,a2)B(b1,b2)代表两点的经纬度*/
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
main()
{
float a1,a2,b1,b2,m,s;
scanf("%f%f%f%f",&a1,&a2,&b1,&b2);
m=fabs(a1-b1);
if(m<180)
s=6371*2*asin(sqrt(0.5*(1-sin(PI/180*a2)*sin(PI/180*b2)-cos(PI/180*a2)*cos(PI/180*b2)*
cos(PI/180*m))));
else
s=6371*2*asin(sqrt(0.5*(1-sin(PI/180*a2)*sin(PI/180*b2)-cos(PI/180*a2)*cos(PI/180*b2)*
cos(PI/180*(360-m)))));
printf("%f\n",s);
}
第4个回答 2012-03-06
下面是所写程序,A(A1,A2),B(B1,B2)代表经纬度。
#include <stdio.h>
#include <math.h>
#define PI 3.1415926
main()
{
float a1,a2,b1,b2,m,s;
scanf("%f%f%f%f",&a1,&a2,&b1,&b2);
m=fabs(a1-b1);
if(m<180)
s=6371*2*asin(sqrt(0.5*(1-sin(PI/180*a2)*sin(PI/180*b2)-cos(PI/180*a2)*cos(PI/180*b2)*
cos(PI/180*m))));
else
s=6371*2*asin(sqrt(0.5*(1-sin(PI/180*a2)*sin(PI/180*b2)-cos(PI/180*a2)*cos(PI/180*b2)*
cos(PI/180*(360-m)))));
printf("%f\n",s);