计算几何(经纬度转坐标) - 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;
}