计算城市间的球面距离(C++实现)
#include<iostream>
#include<string>
#include<cmath>
#include<iomanip> using namespace std; struct City //城市结构体
{
string name;
int EorW;//东经还是西经?东经1,西经0
int NorS;//北纬还是南纬?北纬1,南纬0
double lon;//经度
double lat;//纬度
City()
{
EorW = ;
NorS = ;
}
}; const double PI = 3.1415926;
const double R = 6371.0;//地球半径 int Iputn() //input number输入城市数量
{
int n;
bool flag = true;
while (flag)
{
cout << "请输入城市个数(正整数):" << '\n';
cin >> n;
if ( >= n)
{
cout << "您的输入不符合要求!重新输入请按1,退出请按0:" << '\n';
int choice;
cin >> choice;
if ( != choice){ flag = false; }
}
if (flag)flag = false;
else flag = true;
}
return n;
} int ChoDir(int dir) //choose direction 选择方向(东西经,南北纬)
{
string str1, str2;
if ( == dir){ str1 = "东经"; str2 = "西经"; }
else{ str1 = "北纬"; str2 = "南纬"; }
bool flag = true;
int choice;
while (flag)
{
cout << "请您选择"<<str1<<"还是"<<str2<<":" <<"1." <<str1 << ";" << "0."<<str2 << '\n';
cin >> choice;
if (choice< || choice>)
{
cout << "您的输入不符合要求!重新输入请按1,退出程序请按0:" << '\n';
int choice1;
cin >> choice1;
if (!= choice1)flag = false;
}
if (flag)flag = false;
else flag = true;
}
return choice;
} double Iputcoo(int option) //input coordinate 输入坐标
{
string str;
double up;
if ( == option){ str = "东经"; up = 180.0; }
else if ( == option){ str = "西经"; up = 180.0; }
else if ( == option){ str = "北纬"; up = 90.0; }
else { str = "南纬"; up = 90.0; }
double coor;
bool flag = true;
while (flag)
{
cout << "请您输入" << str << "(0到"<<up<<"间的有理数):" << '\n';
cin >> coor;
if (coor<0.0||coor>up)
{
cout << "您的输入不符合要求,重新输入请按1,退出请按0:" << '\n';
int choise;
cin >> choise;
if ( != choise)flag = false;
}
if (flag)flag = false;
else flag = true;
}
return coor;
} double Calcu(City& P1, City& P2) //calculate 计算两点加球面距
{
if (P1.name == P2.name)return 0.0;
//求AB
double AB;
double OA = sin(P1.lat); double OB = sin(P2.lat);
if (P1.NorS == P2.NorS) AB = fabs(OA - OB);
else AB = OA + OB;
//求夹角
double angle;
if (P1.EorW == P2.EorW) angle = fabs(P1.lon - P2.lon);
else angle = P1.lon + P2.lon;
//求P1A、P2B
double P1A = cos(P1.lat); double P2B = cos(P2.lat);
//求_P1P2_2 (P1'P2的平方)
double _P1P2_2 = P1A*P1A + P2B*P2B - * cos(angle)*P1A*P2B;
//求P1P2_2 (P1P2的平方)
double P1P2_2 = _P1P2_2 + AB*AB;
//求夹角1 (OP1与OP2间的夹角)
double angle1 = acos(( - P1P2_2) / 2.0);
//求球面距
return R*angle1;
} int main()
{
int num = Iputn(); //输入城市数量
if ( >= num){ exit(); }
struct City* city = new City[num];//创建数组
for (int i = ; i < num; i++)
{
getchar(); //输入城市名称
cout << "请您输入城市" << i + << "的名称:" << '\n';
getline(cin, city[i].name);
int choice = ChoDir(); //输入东西经
if (choice< || choice>){ delete[] city; exit(); }
if ( == choice)
{
double elon = Iputcoo();
if (elon<0.0|| elon>180.0)
{
delete[] city;
exit();
}
city[i].lon = PI*elon / 180.0; //角度转弧度
city[i].EorW = ; //东经
}
else
{
double wlon = Iputcoo();
if (wlon<0.0 || wlon>180.0)
{
delete[] city;
exit();
}
city[i].lon = PI*wlon / 180.0;
city[i].EorW = ; //西经
}
choice = ChoDir(); //输入南北纬
if (choice< || choice>){ delete[] city; exit(); }
if ( == choice)
{
double nlat = Iputcoo();
if (nlat<0.0 || nlat>90.0)
{
delete[] city;
exit();
}
city[i].lat = PI*nlat / 180.0;
city[i].NorS = ; //北纬
}
else
{
double slat = Iputcoo();
if (slat<0.0 || slat>90.0)
{
delete[] city;
exit();
}
city[i].lat = PI*slat / 180.0;
city[i].NorS = ; //南纬
}
}
cout << "Start\\End ";
for (int i = ; i < num; i++)
cout << setw()<<setiosflags(ios::left)<<city[i].name;
cout << '\n';
for (int i = ; i < num; i++)
{
cout << setw()<<setiosflags(ios::left)<<city[i].name;
for (int j = ; j < num; j++)
cout << setw() << setiosflags(ios::fixed) << setprecision() << Calcu(city[i], city[j]);
cout << '\n';
}
delete[] city;//delete掉new的数组
return ;
}
计算城市间的球面距离(C++实现)的更多相关文章
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- HDOJ2001计算两点间的距离
计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- 计算两点间的距离,hdu-2001
计算两点间的距离 Problem Description 输入两点坐标(X1,Y1),(X2,Y2),计算并输出两点间的距离. Input 输入数据有多组,每组占一行,由4个实数组成,分别表示x1 ...
- TSQL 根据经纬度计算两点间的距离;返回米(m)
-- ============================================= -- Author:Forrest -- Create date: 2013-07-16 -- Des ...
- 转:Math: Math.atan() 与 Math.atan2() 计算两点间连线的夹角
我们可以使用正切操作将角度转变为斜率,那么怎样利用斜率来转换为角度呢?可以利用斜率的反正切函数将他转换为相应的角度.as中有两个函数可以计算反正切,我们来看一下. 1.Math.atan() Math ...
- 城市间紧急救援(25 分)(dijstra变形)
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- PTA-数据结构 Dijkstra 城市间紧急救援
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- 5-5 城市间紧急救援 (25分)【最短路spfa】
5-5 城市间紧急救援 (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...
- hdu2001 计算两点间的距离【C++】
计算两点间的距离 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
随机推荐
- 怎么配置Java环境变量?
右键计算机 -> 属性 -> 高级系统设置 -> 环境变量, 在系统环境变量添加以下三条变量. 1. PATH, 配置JDK命令文件的位置. 输入“%JAVA_HOME%\bin ...
- 标签data-*属性使用
<div class="page_index" style="margin-top:20px;"> <span id="showPa ...
- unity assert server 与 cache server
Asset server 其实就是unity提供的版本控制工具,不过我们都转到P4V了,上午尝试了一下,如果小团队使用还是不错的,使用过程大致如下,具体的还是要大伙去官网看喽 服务器安装文件下载: h ...
- 便捷从使用git开始
每次浏览网站上传代码,实在过于不便,为此我们引入git来管理我们的代码. 查看帮助手册是了解其的最佳路径,coding.net也不例外.通过浏览https://coding.net/help/,你会发 ...
- Altium Designer 文档信息设置以及模板制作
原理图文档模板制作方法一.在DXP原理图设计环境下,新建一个自由原理图文档.单击:文件→新建→原理图,或者使用快捷键Ctrl+N打开Files资源面板,在“新建”项目下的选择“Schematic Sh ...
- Linux系统下Redis安装(二)
上一篇随笔,已经成功开启了Redis-server,客户端已经可以正常对redis进行正常操作. 但是,redis-server开启的同时,一个大大doc黑屏也在那里开启着,接下来就对讲解如何在Lin ...
- 模式窗口刷新不弹出新窗口触发NET事件
最近做项目的时候用到模式窗口,这个东西我从来没有用过,事实上我是讨厌用这个东西,由于项目需要也只好忍着了.在实现的时候发现了一个问题,打开一个模式窗口后如果里面有asp.net控件并绑定有后台事件的话 ...
- 多个java文件编译并打成jar包经典方法
首先,多个java文件的编译 find . -type f -name *.java > compilelist (.代表当前路径) javac -cp "$CLASSPATH&quo ...
- vim - Putting the current file on the Windows clipboard
http://vim.wikia.com/wiki/VimTip432 command! Copyfile let @*=substitute(expand("%:p"), '/' ...
- html中嵌入天气预报
先看效果: html代码: <div id="weather"></div> js代码: function findWeather() { var city ...