题目大意:

给定半径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|度

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 0x3f3f3f3f
  4. #define LL long long
  5. #define mem(i,j) memset(i,j,sizeof(i))
  6. #define inc(i,j,k) for(int i=j;i<=k;i++)
  7. #define dec(i,j,k) for(int i=j;i>=k;i--)
  8. const int N=1e5+;
  9. const double eps=1e-;
  10. const double PI=acos(-1.0);
  11.  
  12. int dcmp(double x) {
  13. if(abs(x)<eps) return ;
  14. else return x< ? -:;
  15. }
  16. struct P {
  17. double x,y,z;
  18. P(){}
  19. P(double x,double y,double z):x(x),y(y),z(z){}
  20. P operator -(const P& p)const { return P(x-p.x,y-p.y,z-p.z); }
  21. double dot(const P& p) const { return x*p.x+y*p.y+z*p.z; }
  22. bool operator ==(const P& p)const {
  23. return dcmp(x-p.x)== && dcmp(y-p.y)== && dcmp(z-p.z)==;
  24. }
  25. }p[];
  26. double Radian(double t) {
  27. return t*PI/180.0;
  28. }
  29. double lenP(P p) {
  30. return sqrt(p.dot(p));
  31. }
  32. double Angle(P a,P b) {
  33. return acos(a.dot(b)/lenP(a)/lenP(b));
  34. }
  35. int tot;
  36. map<string,int>id;
  37. double R=6378.0;
  38.  
  39. void ptf(string c,int res,string a,string b) {
  40. cout<<c<<" is ";
  41. if(res==-) cout<<"?";
  42. else cout<<res;
  43. cout<<" km off "<<a<<"/"<<b<<" equidistance.\n";
  44. }
  45.  
  46. int main()
  47. {
  48. ios::sync_with_stdio(false);
  49. id.clear(); tot=;
  50.  
  51. string s;
  52. double la,lo;
  53. while(cin>>s) {
  54. if(s=="#") break;
  55. id[s]=++tot;
  56. cin>>la>>lo;
  57. p[tot].x=R*cos(Radian(la))*sin(Radian(lo));
  58. p[tot].y=R*cos(Radian(la))*cos(Radian(lo));
  59. p[tot].z=R*sin(Radian(la));
  60. }
  61.  
  62. string A,B,C;
  63. while(cin>>A) {
  64. if(A=="#") break;
  65. cin>>B>>C;
  66.  
  67. int aid,bid,cid;
  68. bool flag=;
  69.  
  70. if(!id.count(A)) flag=; else aid=id[A];
  71. if(!id.count(B)) flag=; else bid=id[B];
  72. if(!id.count(C)) flag=; else cid=id[C];
  73.  
  74. double ans, ang;
  75. if(flag) ans=-1.0;
  76. else {
  77. P a=p[aid], b=p[bid], c=p[cid];
  78. if(a==b) ans=0.0;
  79. else {
  80. ang=Angle(a-b,c);
  81. ang=abs(ang-PI/2.0);
  82. ans=ang*R+0.5; // 弧长公式
  83. }
  84. }
  85. ptf(C,(int)ans,A,B);
  86. }
  87.  
  88. return ;
  89. }

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. mysql 删除重复数据只保留一条记录

    删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...

  2. 1. ZooKeeper简介

    1. ZooKeeper是什么 ZooKeeper致力于提供一个高性能.高可用,且具备严格的顺序访问控制能力的分布式协调服务,是雅虎公司创建,是Google的Chubby一个开源的实现,也是Hadoo ...

  3. HttpGet请求传递数组(集合)

    在HttpGet请求是传递数组(集合)的方法: 1.使用Ajax方法传递 eg: ajax.({ url:/test, data:["], type:"get" }); ...

  4. 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 ...

  5. rlogin - 远程注册

    SYNOPSIS(总览) rlogin [-8EKLdx ] [-e char ] [-l username ] host DESCRIPTION(描述) Rlogin 在远程主机 host 上开始 ...

  6. 解析天启rk3288源码 /kernel/drivers/char/virtd

    virtd为编译后产生的中间文件,可使用ELF格式逆向 1.ELF文件内容解析readelf: 可解析ELF文件的所有内容;strings: 查看ELF文件中的字符串;file   : 查看ELF文件 ...

  7. htmlunit填坑

    htmlunit 无头浏览器 爬虫使用填坑: <!-- htmlunit start --> <dependency> <groupId>org.jsoup< ...

  8. Center os 用户环境变量

    vi ~/.bash_profile进入用户环境变量设置 export JAVA_HOME=/usr/java/jdk1.7.0_76export JAVA_BIN=$JAVA_HOME/binexp ...

  9. 为什么我们从Angular 2迁移到Vue.js(为什么我们没有选择React)

    在Rever(www.reverscore.com),我们刚刚使用Vue.js发布了我们的Web客户端的新版本.经过641次提交和16周的紧张开发,我们非常自豪之前做出的决定.8个月前,我们的前端在使 ...

  10. centos 6.5 切换用户

    root --> user,无需密码 su username user --> root,需要 root 密码 su root root 可省略