题目大意:

给定半径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. HttpGet请求传递数组(集合)

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

  2. Windows 下 MySQL 备份脚本

    @title MySQL备份脚本 @echo off @echo root@127.0.0.1:3306 set host=127.0.0.1 set port=3306 set user=root ...

  3. 字符串函数-unquote()函数

    字符串函数顾名思意是用来处理字符串的函数.Sass 的字符串函数主要包括两个函数: unquote($string):删除字符串中的引号: quote($string):给字符串添加引号. 1.unq ...

  4. Sass-乘法

    Sass 中的乘法运算和前面介绍的加法与减法运算还略有不同.虽然他也能够支持多种单位(比如 em ,px , %),但当一个单位同时声明两个值时会有问题.比如下面的示例: 编译的时候报“20px*px ...

  5. Vue实例与组件的关系

    所有的 Vue 组件都是 Vue 实例,可以看成Vue组件就是Vue实例的扩展. <div id="app"> <child></child> ...

  6. JS 判断undefined

    tax !== underfined underfined 是判断的是类型的结果, 如果加typeof后是字符串类型 写法:typeof(tax) !== "underfined" ...

  7. Android自动化测试框架UIAutomator原理浅析

    UIAutomator是一个Android自动化测试框架,是谷歌在Android4.1版本发布时推出的一款用Java编写的UI测试框架,它只能用于UI即黑盒方面的测试.所以UIAutomator只能运 ...

  8. 【优化】Mysql字段尽可能用NOT NULL

    下面咱们要聊的是 MySQL 里的 null,在大量的 MySQL 优化文章和书籍里都提到了字段尽可能用NOT NULL,而不是NULL,除非特殊情况.但却都只给结论不说明原因,犹如鸡汤不给勺子一样, ...

  9. Linux系统重要文件

    Linux系统重要文件介绍与配置 一网卡配置文件 (一)网卡配置文件参数介绍 文件路径信息:/ec/sysconfig/network-scripts/ifcfg-eth0 文件作用说明:配置网卡地址 ...

  10. 如何写一个bat文件,让他去执行某一个地方的bat文件

    新建一个bat文件,里面编写如下内容:@echo offcall 你bat文件的路径\startup.bat pause --------------------------------------- ...