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

计算几何(经纬度转坐标) - 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值