题目大意:

给定半径6378km的球上的 多个地点 及其  经纬度

多个询问 给定三个地点 A B C

A与B的等距点在球上形成一个大圆

即球面上有一个到两点距离相等的大圆

且大圆所在平面垂直两点连线

求C点到该大圆的最近球面距离

1.特殊情况即A B为同一点 此时整个球面上的点都是等距点

则C到等距点的最近球面距离为0

2.设两点与球心组成一个平面S1 大圆与球面组成的平面S2

则S1与S2垂直 即两个平面相差90度

求出球心到C的向量cd与S1的夹角为ang度

则cd与S2的夹角则为|ang-90|度

#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define LL long long
#define mem(i,j) memset(i,j,sizeof(i))
#define inc(i,j,k) for(int i=j;i<=k;i++)
#define dec(i,j,k) for(int i=j;i>=k;i--)
const int N=1e5+;
const double eps=1e-;
const double PI=acos(-1.0); int dcmp(double x) {
if(abs(x)<eps) return ;
else return x< ? -:;
}
struct P {
double x,y,z;
P(){}
P(double x,double y,double z):x(x),y(y),z(z){}
P operator -(const P& p)const { return P(x-p.x,y-p.y,z-p.z); }
double dot(const P& p) const { return x*p.x+y*p.y+z*p.z; }
bool operator ==(const P& p)const {
return dcmp(x-p.x)== && dcmp(y-p.y)== && dcmp(z-p.z)==;
}
}p[];
double Radian(double t) {
return t*PI/180.0;
}
double lenP(P p) {
return sqrt(p.dot(p));
}
double Angle(P a,P b) {
return acos(a.dot(b)/lenP(a)/lenP(b));
}
int tot;
map<string,int>id;
double R=6378.0; void ptf(string c,int res,string a,string b) {
cout<<c<<" is ";
if(res==-) cout<<"?";
else cout<<res;
cout<<" km off "<<a<<"/"<<b<<" equidistance.\n";
} int main()
{
ios::sync_with_stdio(false);
id.clear(); tot=; string s;
double la,lo;
while(cin>>s) {
if(s=="#") break;
id[s]=++tot;
cin>>la>>lo;
p[tot].x=R*cos(Radian(la))*sin(Radian(lo));
p[tot].y=R*cos(Radian(la))*cos(Radian(lo));
p[tot].z=R*sin(Radian(la));
} string A,B,C;
while(cin>>A) {
if(A=="#") break;
cin>>B>>C; int aid,bid,cid;
bool flag=; if(!id.count(A)) flag=; else aid=id[A];
if(!id.count(B)) flag=; else bid=id[B];
if(!id.count(C)) flag=; else cid=id[C]; double ans, ang;
if(flag) ans=-1.0;
else {
P a=p[aid], b=p[bid], c=p[cid];
if(a==b) ans=0.0;
else {
ang=Angle(a-b,c);
ang=abs(ang-PI/2.0);
ans=ang*R+0.5; // 弧长公式
}
}
ptf(C,(int)ans,A,B);
} return ;
}

POJ 2412 /// 空间几何 经纬度转三维坐标 角度转弧度 法向量的更多相关文章

  1. ACM1174_爆头解题思路_空间三维坐标求点到直线的距离

    /* 爆头 Description gameboy是一个CS高手,他最喜欢的就是扮演警察, 手持M4爆土匪的头.也许这里有人没玩过CS,有必 要介绍一下“爆头”这个术语:所谓爆头,就是子 弹直接命中对 ...

  2. OpenGL 的空间变换(上):矩阵在空间几何中的应用

    在使用 OpenGL 的应用程序中,当我们指定了模型的顶点后,顶点依次会变换到不同的 OpenGL 空间中,最后才会被显示到屏幕上.在变换的过程中,通过使用矩阵,我们更高效地来完成这些变换工作. 本篇 ...

  3. “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”

    0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...

  4. OpenGL 获取当前屏幕坐标的三维坐标(gluUnProject使用例子 Qt)

    之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现. 代码如下:  main.cpp  12345678 ...

  5. MATLAB在三维坐标中显示图片 并 使得图片部分透明

    要画一个光路图,本来可以用proe,但是鼠标不好用,有些操作也忘了,用MATLAB画了个.下面是用到的图片. 但是三维坐标中显示彩色图片的目标没有搞定,做了个灰度图,然后用仿射程序将彩色图片贴到了二维 ...

  6. OpenGL 获取当前屏幕坐标对应的三维坐标

    转自原文 OpenGL 获取当前屏幕坐标对应的三维坐标,使用很简单glu库中的一个函数 #include <GL/glut.h> #include <stdlib.h> #in ...

  7. VTK根据三维坐标点集生成点云

    一个简单的利用VTK根据三维坐标点集生成点云的例子,仅供参考. 一.环境:vtk-8.1 & vs2013(需自行配置vtk的环境) 二.我所读取的三维坐标点集为txt格式文件,每个点的x,y ...

  8. vs中使用M_PI的问题及解决 角度转弧度&根据弧度计算圆周上点的坐标的方法

    M_PI 是一个宏定义,圆周率的定义           C/C++ code #define M_PI 3.14159265358979323846 此宏定义和编译器有关,TC中M_PI宏就定义在& ...

  9. 角度转弧度&根据弧度计算圆周上点的坐标的方法

    角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = ...

随机推荐

  1. 【问题解决方案】GitHub仓库重构之将某个或某些文件夹移动到其他文件夹内

    仓库重构时遇到的问题,在GitHub页面里好像没有类似的操作按钮? 搜了一下好像要用到一些命令比如rm等,但是我对Linux类的命令不是很熟悉 于是想试试曲线救国,先把远程库的文件pull到本地,在本 ...

  2. c# UDP分包发送

    考虑到UDP的高速和其他协议的复杂性,做了一个依靠时间发送的分包组包重发的UDP库. https://github.com/jinyuttt/UDPTTL.git

  3. 对象名 XXX 无效。

    对象名 XXX 无效. 首先检查自己数据库连接字符串是否正确!!! 已经有过好几次这样的错误了,还是不长记性,特意记下

  4. 2018-8-10-win10-uwp-毛玻璃

    title author date CreateTime categories win10 uwp 毛玻璃 lindexi 2018-08-10 19:16:50 +0800 2018-2-13 17 ...

  5. Linux就该这么学05学习笔记

    参考链接:https://www.linuxprobe.com/chapter-05.html   1.用户身份和能力 用户 管理员UID为0:系统的管理员用户. 系统用户UID为1-999: Lin ...

  6. go语言学习之从例子开始

    [目录] go语言从例子开始之Example1.helloworld go语言从例子开始之Example2.类型 go语言从例子开始之Example3.变量 go语言从例子开始之Example4.常量 ...

  7. autoit3 脚本自动安装实例

    软件自动安装的相关实例!贴出来用于参考,并部分相关语法与示例 #RequireAdmin If DriveMapGet("T:")=="" Then Drive ...

  8. kali网络源配置

    使用vim对sources.list文件进行修改: $   vim /etc/apt/sources.list 随便挑选一个源添加到该文件中 ----------------------------- ...

  9. 初识java-1.Java跨平台的原理

    计算机只认识二进制的机器指令,而且不同的平台的计算机的机器指令不同.Java中将程序员编写的源码文件编译成字节码文件,在不同的计算机平台上安装不同的虚拟机,虚拟机将同一份字节码文件解释为不同的机器指令 ...

  10. Web项目改名的带来的404not found问题

    为了保留上一次编辑的billsys web项目,把项目复制一份到同一个工作空间后,对原来项目名进行了重命名,如右图: 结果再去访问,一直报404错误 解决思路如下: 其实仔细观察,会在项目部署界面发现 ...