zoukankan      html  css  js  c++  java
  • UVa 11817

    题目:给出地球上的两个点的经度和纬度,计算两点球面距离和两点的空间距离差。

    分析:计算几何、大地坐标系。利用公式可直接解得两点的空间距离:

                d = r*sqrt(2-2*(cos(lat1)*cos(lat2)*cos(lon1-lon2)+sin(lat1)*sin(lat2)))

                推导过程如下:

                          

                如图,C,D为已知两点则有如下推导:            

                AB = r*cos(lat1);DE = r*cos(lat2);BE = r*sin(lat1) + r*sin(lat2);

                AD*AD = BE*BE + (AB-DE)*(AB-DE) = 2*r*r - 2*r*r*sin(lat1)*sin(lat2) - 2*r*r*cos(lat1)*cos(lat2);

                AC*AC = 2*AB*AB - 2*AB*AB*cos(lon1-lon2) = 2*r*r*cos(lat1)*cos(lat1)*(1-cos(lon1-lon2));

                DF*DF = 2*DE*DE - 2*DE*DE*cos(lon1-lon2) = 2*r*r*cos(lat2)*cos(lat2)*(1-cos(lon1-lon2));

                AC*DF = 2*r*r*cos(lat1)*cos(lat2)*(1-cos(lon1-lon2));

                由托勒密定理有 AC*DF + AD*AD = CD*CD 整理有:

                CD = r*sqrt(2-2*(cos(lat1)*cos(lat2)*cos(lon1-lon2)+sin(lat1)*sin(lat2)));

    注意:输出最近的整数,%.0lf即可。

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    
    int main()
    {
    	double r = 6371009;
    	double p = acos(-1.0);
    	
    	int    n;
    	double l1,d1,l2,d2;
    	while ( scanf("%d",&n) != EOF )
    	while ( n -- ) {
    		scanf("%lf%lf%lf%lf",&l1,&d1,&l2,&d2);
    		l1 *= p/180.0; l2 *= p/180.0;
    		d1 *= p/180.0; d2 *= p/180.0;
    		
    		double d = r*sqrt(2-2*(cos(l1)*cos(l2)*cos(d1-d2)+sin(l1)*sin(l2)));
    		printf("%.0lf
    ",2*asin(d/(2*r))*r-d);
    	}
    	return 0;
    }
    
  • 相关阅读:
    bcdedit /copy {current} /d "xxx" 报错,提示找不到系统文件
    Moving docker images location to different partition
    docker 使用save和load命令来转移image
    docker image rm ubuntu 失败
    yum国内镜像配置
    VMware下安装CentOS7 无法通过桥接模式进行联网
    docker大概理解
    windows cmd 切换磁盘
    使用Git向GitHub上上传代码
    抛砖引玉——进程和线程的理解方式
  • 原文地址:https://www.cnblogs.com/riskyer/p/3364630.html
Copyright © 2011-2022 走看看