题目大意:

给定半径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. 2018-8-10-win10-uwp-线程池

    title author date CreateTime categories win10 uwp 线程池 lindexi 2018-08-10 19:16:50 +0800 2018-05-15 1 ...

  2. go语言从例子开始之Example34.速率限制

    速率限制(英) 是一个重要的控制服务资源利用和质量的途径.Go 通过 Go 协程.通道和打点器优美的支持了速率限制. Example: package main import "fmt&qu ...

  3. 批量定时任务将rtf文件转为docx,入参是rtf文件夹,生成一个docx文件夹

    java,python等语言对于rft的处理很受限,rtf提供了很少的api供外部调用处理,但是对于docx我们却又很多api来处理,所以很多人会有需求将rtf批量转为docx的需求,接下来就来说说解 ...

  4. 为什么单个binlog会大于max_binlog_size设置

    查看参数设置mysql> show global variables like '%max_binlog_size%';+-----------------+------------+| Var ...

  5. ajax处理返回的三种格式(json格式 , xml通用格式 , html文本格式)(数据类型:整数、字符串、数组、对象)(基础最重要!)

    ajax方法的参数 常用的ajax参数比如url,data,type,包括预期返回类型dataType,发送到服务器的数据的编码类型contentType,成功方法,失败方法,完成方法.除了这些以外还 ...

  6. Sublime Text 注册及使用相关

    sublime text3 注册码 2019-07-01 注册码可以直接用 地址: 2019-07-01 亲测可用 2019-07-18 亲测可用 -– BEGIN LICENSE -– Die So ...

  7. shell脚本学习(5)join

    join  不是简单的把两个文本连接起来 sale.txt quotas.txt

  8. html插入链接的实现方法

    下面就为大家带来一篇html插入链接的实现方法.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   每个网页都已一个地址,用URL()标识,通常在网站内部创建链接时,通常 ...

  9. 「树的直径」BFS方法证明

    选定任意一个点u,从u开始BFS求出距离u最大的点s,再从s点出发BFS到距离s最大的点t,则dis(s,t)即为树的直径 证明 其实只要找到了树的直径的一个端点,再BFS找到最远点就一定是直径的另一 ...

  10. [LightOJ1070]Algebraic Problem

    题目:Algebraic Problem 链接:https://vjudge.net/problem/LightOJ-1070 分析: 1)$ a^n+b^n = ( a^{n-1}+b^{n-1} ...