UVA11817 Tunnelling the Earth(计算几何基础)

 

Sample Input
1
43.466667 -80.516667 30.058056 31.228889
Sample Output
802333

 输入两个点的经纬度,已知地球半径为 6 371 009 ,求这两点之间的弧长与直线距离的差

不难想到要将所给点的经纬度转化成球上的坐标,剩下的按照常规求解,将这两个点看做成一个向量

  • 向量的长度为直线距离 = 向量自身的点积 再 开平方
  • 弧长=两点与坐标原点所形成向量的夹角*地球半径
    struct Point
    {
        double x,y,z;
        Point(double x=0,double y=0,double z=0):x(x),y(y),z(z){}
    };

typedef Point Vector;
Vector operator-(Vector a,Vector b){ return Vector(a.x-b.x,a.y-b.y,a.z-b.z); }
double Dot(Vector a,Vector b){ return a.x*b.x+a.y*b.y+a.z*b.z; }
double length(Vector a){ return sqrt(Dot(a,a)); }

double torad(double rad)
{
    return rad/180*pi;
}

const double R=6371009;
Point get_point(double a,double b)
{
    double x=R*cos(a)*cos(b);
    double y=R*cos(a)*sin(b);
    double z=R*sin(a);
    return Point(x,y,z);
}

int main()
{
    //IOS;
    rush(){
        double a,b,c,d;
        sff(a,b); sff(c,d);
        a=torad(a),b=torad(b),c=torad(c),d=torad(d);
        Point x=get_point(a,b);
        Point y=get_point(c,d);
        double len=length(x-y); //两点之间的直线长度
        double ans=acos(Dot(x,y)/length(x)/length(y))*R;//两点之间的弧长
        ans=ans-len+0.5;
        printf("%d\n",int(ans));
    }
    //PAUSE;
    return 0;
}

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页