POJ 2412 /// 空间几何 经纬度转三维坐标 角度转弧度 法向量
题目大意:
给定半径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 /// 空间几何 经纬度转三维坐标 角度转弧度 法向量的更多相关文章
- ACM1174_爆头解题思路_空间三维坐标求点到直线的距离
/* 爆头 Description gameboy是一个CS高手,他最喜欢的就是扮演警察, 手持M4爆土匪的头.也许这里有人没玩过CS,有必 要介绍一下“爆头”这个术语:所谓爆头,就是子 弹直接命中对 ...
- OpenGL 的空间变换(上):矩阵在空间几何中的应用
在使用 OpenGL 的应用程序中,当我们指定了模型的顶点后,顶点依次会变换到不同的 OpenGL 空间中,最后才会被显示到屏幕上.在变换的过程中,通过使用矩阵,我们更高效地来完成这些变换工作. 本篇 ...
- “为什么DirectX里表示三维坐标要建一个4*4的矩阵?”
0x00 前言 首先要说明的是,本文的标题事实上来自于知乎上的一个同名问题:为什么directX里表示三维坐标要建一个4*4的矩阵? - 编程 .因此,正如Milo Yip大神所说的这个标题事实上是存 ...
- OpenGL 获取当前屏幕坐标的三维坐标(gluUnProject使用例子 Qt)
之前使用VS+glut实现了gluUnProject使用例子,用于渲染管道的逆过程,将屏幕坐标转换为opengl三维坐标,本文将尝试使用QT来实现. 代码如下: main.cpp 12345678 ...
- MATLAB在三维坐标中显示图片 并 使得图片部分透明
要画一个光路图,本来可以用proe,但是鼠标不好用,有些操作也忘了,用MATLAB画了个.下面是用到的图片. 但是三维坐标中显示彩色图片的目标没有搞定,做了个灰度图,然后用仿射程序将彩色图片贴到了二维 ...
- OpenGL 获取当前屏幕坐标对应的三维坐标
转自原文 OpenGL 获取当前屏幕坐标对应的三维坐标,使用很简单glu库中的一个函数 #include <GL/glut.h> #include <stdlib.h> #in ...
- VTK根据三维坐标点集生成点云
一个简单的利用VTK根据三维坐标点集生成点云的例子,仅供参考. 一.环境:vtk-8.1 & vs2013(需自行配置vtk的环境) 二.我所读取的三维坐标点集为txt格式文件,每个点的x,y ...
- vs中使用M_PI的问题及解决 角度转弧度&根据弧度计算圆周上点的坐标的方法
M_PI 是一个宏定义,圆周率的定义 C/C++ code #define M_PI 3.14159265358979323846 此宏定义和编译器有关,TC中M_PI宏就定义在& ...
- 角度转弧度&根据弧度计算圆周上点的坐标的方法
角度转弧度: #define AngleToRadian(angle) (M_PI/180.0f)*angle 以正东面为0度起点计算指定角度所对应的圆周上的点的坐标: float radian = ...
随机推荐
- ERROR in Template execution failed: ReferenceError: htmlwebpackPlugin is not defined
ejs文件配置如下: <!DOCTYPE html> <html lang="zh-CN"> <head> <title>webpa ...
- RabbitMQ ——四种ExChange及完整示例
RabbitMQ常用的Exchange Type有fanout.direct.topic.headers这四种,下面分别进行介绍. 这四种类的exchange分别有以下一些属性,分别是: name:名 ...
- javascript跨浏览器操作xml
//跨浏览器获取xmlDom function getXMLDOM(xmlStr) { var xmlDom = null; if (typeof window.DOMParser != 'undef ...
- rabbiitmq非阻塞调用
https://blog.csdn.net/panxianzhan/article/details/50755409 https://blog.csdn.net/u013946356/article/ ...
- OtterCTF - Reverse - Msg Me This
原文地址:Msg Me This 题目 Category: Reverse Engineering Points: 500 Solves: 15 Description: Rick created a ...
- 【Leetcode周赛】从contest-41开始。(一般是10个contest写一篇文章)
Contest 41 ()(题号) Contest 42 ()(题号) Contest 43 ()(题号) Contest 44 (2018年12月6日,周四上午)(题号653—656) 链接:htt ...
- Vue:列表渲染 v-for on a <template>
类似于 v-if,你也可以利用带有 v-for 的 <template> 渲染多个元素.比如: <html> <head> <title>Vue v-f ...
- gitlab私钥配置
一.Linux版 1).首先打开linux服务器,输入命令:ls -al ~/.ssh,检查是否显示有id_rsa.pub或者id_dsa.pub存在,如果存在请直接跳至第3步. 2).在bash中输 ...
- bzoj4244 & loj2878. 「JOISC 2014 Day2」邮戳拉力赛 括号序列+背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4244 https://loj.ac/problem/2878 题解 挺妙的一道题. 一开始一直 ...
- 【NLP新闻-2013.06.03】New Book Where Humans Meet Machines
英语原文地址:http://nlp.hivefire.com/articles/share/39865/ 注:本人翻译NLP新闻只为学习专业英语和扩展视野,如果翻译的不好,请谅解! (我挺想看这本书的 ...