欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算几何(经纬度转坐标) - Tunnelling the Earth - UVA 11817

程序员文章站 2022-04-02 19:01:27
...

计算几何(经纬度转坐标) - Tunnelling the Earth - UVA 11817

题意:

T 组 测 试 样 例 , 每 组 包 括 四 个 浮 点 数 , T组测试样例,每组包括四个浮点数, T

分 别 表 示 地 球 上 两 个 点 的 纬 、 经 度 。 分别表示地球上两个点的纬、经度。

整 数 表 示 东 经 、 北 纬 , 负 数 表 示 西 经 、 南 纬 。 整数表示东经、北纬,负数表示西经、南纬。 西

地 球 半 径 取 6371009 。 地球半径取6371009。 6371009

计 算 出 这 个 两 个 点 的 在 球 面 上 的 弧 长 与 弦 长 , 输 出 弧 长 与 弦 长 之 差 。 计算出这个两个点的在球面上的弧长与弦长,输出弧长与弦长之差。

输入:

首 行 一 个 正 整 数 T , 首行一个正整数T, T

接 着 T 行 数 据 , 每 行 四 个 浮 点 数 。 接着T行数据,每行四个浮点数。 T

输出:

两 点 弧 长 与 弦 长 之 差 。 结 果 四 舍 五 入 到 整 数 部 分 。 两点弧长与弦长之差。结果四舍五入到整数部分。

Sample Input

1
43.466667 -80.516667 30.058056 31.228889

Sample Output

802333

分析:

空 间 几 何 基 础 , 经 纬 度 转 三 维 坐 标 。 利 用 极 坐 标 转 化 。 空间几何基础,经纬度转三维坐标。利用极坐标转化。

代码:

#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>

using namespace std;

//三维几何基础
struct Point3
{
    double x,y,z;
    Point3(double x=0,double y=0,double z=0) : x(x), y(y), z(z) {}
};

typedef Point3 Vector3;

Vector3 operator + (Vector3 A,Vector3 B)
{
    return Vector3(A.x+B.x,A.y+B.y,A.z+B.z);
}

Vector3 operator - (Vector3 A,Vector3 B)
{
    return Vector3(A.x-B.x,A.y-B.y,A.z-B.z);
}

Vector3 operator * (Vector3 A,double p)
{
    return Vector3(A.x*p,A.y*p,A.z*p);
}

Vector3 operator / (Vector3 A,double p)
{
    return Vector3(A.x/p,A.y/p,A.z/p);
}

double Dot(Vector3 A,Vector3 B) { return A.x*B.x+A.y*B.y+A.z*B.z; }

double Length(Vector3 A) { return sqrt(Dot(A,A)); }

double Angle(Vector3 A,Vector3 B) { return acos(Dot(A,B)/Length(A)/Length(B)); }

double torad(double deg)
{
    return deg/180*acos(-1);
}

const double R=6371009;

// 经纬度转换为球坐标
void get_coordinate(double R,double lat,double lng,double &x,double &y,double &z)
{
    lat = torad(lat);
    lng = torad(lng);
    x = R*cos(lat)*cos(lng);
    y = R*cos(lat)*sin(lng);
    z = R*sin(lat);
}

int main()
{
    int T;
    double a,b,c,d;
    double x1,y1,z1,x2,y2,z2;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%lf%lf%lf%lf",&a,&b,&c,&d);
        get_coordinate(R,a,b,x1,y1,z1);
        get_coordinate(R,c,d,x2,y2,z2);
        Point3 A=Point3(x1,y1,z1), B=Point3(x2,y2,z2);
        Vector3 OA=A, OB=B;
        double th=Angle(OA,OB);
        double L1=th*R;
        double L2=Length(A-B);
        printf("%d\n",int(L1-L2+0.5));
    }
    
    return 0;
}