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 = ...
随机推荐
- mysql 删除重复数据只保留一条记录
删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...
- 1. ZooKeeper简介
1. ZooKeeper是什么 ZooKeeper致力于提供一个高性能.高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoo ...
- HttpGet请求传递数组(集合)
在HttpGet请求是传递数组(集合)的方法: 1.使用Ajax方法传递 eg: ajax.({ url:/test, data:["], type:"get" }); ...
- 2019-9-8-WPF-渲染原理
title author date CreateTime categories WPF 渲染原理 lindexi 2019-9-8 10:40:0 +0800 2018-7-15 16:2:47 +0 ...
- rlogin - 远程注册
SYNOPSIS(总览) rlogin [-8EKLdx ] [-e char ] [-l username ] host DESCRIPTION(描述) Rlogin 在远程主机 host 上开始 ...
- 解析天启rk3288源码 /kernel/drivers/char/virtd
virtd为编译后产生的中间文件,可使用ELF格式逆向 1.ELF文件内容解析readelf: 可解析ELF文件的所有内容;strings: 查看ELF文件中的字符串;file : 查看ELF文件 ...
- htmlunit填坑
htmlunit 无头浏览器 爬虫使用填坑: <!-- htmlunit start --> <dependency> <groupId>org.jsoup< ...
- Center os 用户环境变量
vi ~/.bash_profile进入用户环境变量设置 export JAVA_HOME=/usr/java/jdk1.7.0_76export JAVA_BIN=$JAVA_HOME/binexp ...
- 为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)
在Rever(www.reverscore.com),我们刚刚使用Vue.js发布了我们的Web客户端的新版本.经过641次提交和16周的紧张开发,我们非常自豪之前做出的决定.8个月前,我们的前端在使 ...
- centos 6.5 切换用户
root --> user,无需密码 su username user --> root,需要 root 密码 su root root 可省略