地球的平均半径为6371千米,已知地球上两个城市A、B的经度和纬度,编程序求出这两个城市之间的地面距离

作者&投稿:孛底 (若有异议请与网页底部的电邮联系)
地球的平均半径为6371千米,已知地球上两个城市A、B的经度和纬度,编程序求出这两个城市之间的地面距离。~

#include
#include

using namespace std;

#ifndef M_PI
#define M_PI (3.141592653)
#endif

#define EARTH_R (6371.0)
#define MIN_DISTANCE (0.00001)//最小分辨度为1厘米

//求double类型的绝对值
double dabs(double value){
return value > 0.0 ? value : (0.0 - value);
}

//求double类型的较大数
double max(double a, double b){
return a > b ? a : b;
}
//求double类型的较小数
double min(double a, double b){
return a < b ? a : b;
}

double toRadian(double angle){
return angle / 360.0 * 2 * M_PI;
}

//已知半径、圆心角角度(弧度制),求圆心角对应的弦长
double getChordByRadiusAngle(double radius, double angle){
return 2.0 * radius * sin((angle / 2.0));//求得弦长
}

//已知半径、弦长,求弧对应的弧度(弧度制)
double getAngleByRadiusChord(double radius, double chord){
return 2.0 * asin(chord / 2.0 / radius);//求得弦对应的大圆圆心角,弧度制
}

//已知半径、弦长,求弦端点在球面上的距离
double getArcByRadiusChord(double radius, double chord){
double angle =getAngleByRadiusChord(radius, chord);//求得弦对应的大圆圆心角,弧度制

double distance = (M_PI * radius) * (angle / M_PI);
return distance;
}

//经度相同,求纬度不同的两点A、B间的弦长
//输入:A点的纬度([90,-90],北纬为正)、B点的纬度
//输出:点A、B间的弦长
double chord_Longitude(double latitudeA, double latitudeB){
double latitudeDiff = dabs(latitudeA - latitudeB);
double angle = toRadian(latitudeDiff);//求得大圆圆心角,弧度制

return getChordByRadiusAngle(EARTH_R, angle);//求得弦长
}

//纬度相同,求经度不同的两点A、B间的弦长
//输入:A点的经度([180,-180],东经为正)、B点的经度、纬度([90,-90],北纬为正)
//输出:点A、B间的弦长
double chord_Latitude(double longitudeA, double longitudeB, double latitude){
latitude = dabs(latitude);
double laR = EARTH_R * cos((latitude / 180.0) * M_PI);//求得纬线圈半径

double longitudeDiff = dabs(longitudeA - longitudeB);
longitudeDiff = longitudeDiff < 180.0 ? longitudeDiff : (360.0 - longitudeDiff);
double angle = toRadian(longitudeDiff);

return getChordByRadiusAngle(laR, angle);//求得弦长
}



//输入两点的经纬度,求出两点的距离
//输入:A点的经度([180,-180],东经为正)、A点的纬度([90,-90],北纬为正)、B点的经度、B点的纬度
//输出:点A、B的距离
//先求得两点的弦长,再求弦对应的大圆圆心角,最后得到大圆弧线长即为距离
double distanceOf2Points(double longitudeA, double latitudeA, double longitudeB, double latitudeB){
double chord = 0.0;
/*
if(longitudeA == longitudeB){//经度相同
chord = chord_Longitude(latitudeA, latitudeB);
}else if(latitudeA == latitudeB){//纬度相同
chord = chord_Latitude(longitudeA, longitudeB, latitudeA);
}else{*/
//求以AB为对角线,以过点A、B的两条纬线、经线的四个交点为顶点的等腰梯形的四条边长
double baselineA = chord_Latitude(longitudeA, longitudeB, latitudeA);//过点A的底线长
double baselineB = chord_Latitude(longitudeA, longitudeB, latitudeB);//过点B的底线长
double waistline = chord_Longitude(latitudeA, latitudeB);//腰线长
/*
if(baselineA == baselineB){//实为矩形
chord = sqrt(baselineA * baselineA + waistline * waistline);
std::cout<<"矩形: "<<chord<<endl;
}else{*/
double baselineS = min(baselineA, baselineB);//较短的底线
double baselineL = max(baselineA, baselineB);//较长的底线
double shortline = (baselineL - baselineS) / 2.0;//分割中间矩形后,边侧直角三角形的边

chord = sqrt(waistline * waistline - shortline * shortline + (baselineL - shortline) * (baselineL - shortline));
//}
//}

double distance = getArcByRadiusChord(EARTH_R, chord);
if(distance >= MIN_DISTANCE){
return distance;
}
return 0.0;
}

int main(){
double params[4];
int i;
double distance;

std::cout<<"输入格式:A点经度 A点纬度 B点经度 B点纬度"<<std::endl<<std::endl;

while(true){
i = 0;
distance = -1.0;
while(std::cin>>params[i]){//读入四个经纬值
i++;
if(4 == i){
break;
}
}
if(4 == i){
distance = distanceOf2Points(params[0], params[1], params[2], params[3]);
std::cout<<"A点("<<params[0]<<","<<params[1]<<")、B点("<<params[2]<<","<<params[3]<<") 的距离为:"<<std::endl<<distance<<"(千米)"<<std::endl<<std::endl;
}else{
break;//输入非数字 字符时,结束程序
}
}
return 0;
}

我正在给你写,请不要采纳别人的答案

求出经纬度差,根据cosθ=cosθ1cosθ2求出两城到球心的角的弧度θ,再根据L = θ * R可求球面距离。
编程如下,仅是给个思路,考虑不周之处楼主请自行完善。

#include <stdio.h>
#include <math.h>
#include <string>
using namespace std;

const double R = 6371.0;
const double PI = 3.141592653;

struct Coordinate
{
string X;//经度
string Y;//纬度
};

double GetTheta(Coordinate& A,Coordinate& B)
{
int la,lb;
double a,b,dx,dy;
char cha,chb;
string ax,ay,bx,by;

ax = A.X;
ay = A.Y;
bx = B.X;
by = B.Y;

la = ax.length();
lb = bx.length();
cha = ax[la-1]; ax[la-1] = 0;
chb = bx[lb-1]; bx[lb-1] = 0;
sscanf(ax.data(),"%lf",&a);
sscanf(bx.data(),"%lf",&b);
if(cha == chb)
dx = abs(a-b);
else
{
dx = abs(a+b);
if(dx > 180) dx = 360 - dx;
}

la = ay.length();
lb = by.length();
cha = ay[la-1]; ay[la-1] = 0;
chb = by[lb-1]; by[lb-1] = 0;
sscanf(ay.data(),"%lf",&a);
sscanf(by.data(),"%lf",&b);
if(cha == chb)
dy = abs(a-b);
else
dy = abs(a+b);

dx = dx * PI / 180;//角度转弧度
dy = dy * PI / 180;
return acos(cos(dx)*cos(dy)) ;

}

int main()
{
double theta,dis;

Coordinate A,B;
A.X = "12.35E";
A.Y = "23.05N";

B.X = "30.25E";
B.Y = "20.28S";

theta = GetTheta(A,B);

dis = theta * R;

printf("%.2lfkm\n",dis);

return 0;
}

#include<stdio.h>
#include<math.h>
#define PI 3.141592653
double Yxdl_C(double a,double b,double c) /*余弦定理*/
{
return acos((a*a+b*b-c*c)/(2*a*b));
}
void main()
{
double R=6371.0,S1,S2,S3,S4,S5,DMJL;
double A_jd,A_wd,B_jd,B_wd,wdc,jdc,zjdc;
printf("规定东经为正,北纬为正;西经为负,南纬为负,请对应输入符号。\n");
lp:
printf("请输入A点经度:");
scanf("%lf",&A_jd);if(fabs(A_jd)>180.0){printf("输入有误,请重新输入!\n");goto lp;}
printf("请输入A点纬度:");
scanf("%lf",&A_wd);if(fabs(A_wd)>90.0){printf("输入有误,请重新输入!\n");goto lp;}
printf("请输入B点经度:");
scanf("%lf",&B_jd);if(fabs(B_jd)>180.0){printf("输入有误,请重新输入!\n");goto lp;}
printf("请输入B点纬度:");
scanf("%lf",&B_wd);if(fabs(B_wd)>90.0){printf("输入有误,请重新输入!\n");goto lp;}
printf("A点位置:");if(A_jd>0)printf("东");else printf("西");printf("经%.3f°,",fabs(A_jd));
if(A_wd>0)printf("北");else printf("南");printf("纬%.3f°\n",fabs(A_wd));
printf("B点位置:");if(B_jd>0)printf("东");else printf("西");printf("经%.3f°,",fabs(B_jd));
if(B_wd>0)printf("北");else printf("南");printf("纬%.3f°\n",fabs(B_wd));
if(fabs(A_jd-B_jd)>180)jdc=fabs(A_jd-B_jd)-180;else jdc=fabs(A_jd-B_jd); /*计算经度差*/
wdc=fabs(A_wd-B_wd); /*计算纬度差*/
S5=2*R*sin(PI*jdc/2/180)*cos(B_wd*PI/180);
zjdc=Yxdl_C(R,R,S5);
S1=R*sin(PI*wdc/180);
S2=R*sin(zjdc);
S3=fabs(R*(cos(PI*wdc/180)-cos(zjdc)));
S4=sqrt(S1*S1+S2*S2+S3*S3); /*两点间直线距离*/
DMJL=R*Yxdl_C(R,R,S4);
printf("A、B两点地面距离为:%lf千米。\n",DMJL);
goto lp;
}
/*终于弄好了,不懂的可以问我*/

这不是数学问题么,吧两城市的地面距离看成扇面。


地球平均半径是63KM,极半径约6357KM,赤道半径为6378KM,这是受 影响的...
极半径比赤道半径短,这个我们从开始 认识地球 就知道了,因为书上说,地球并不是正圆的,这个半径的差异,是由于地球本身的自转和公转,受太阳的因为所引起的。

地球的半径约为6370km,则质量为40kg的卫星,上升到高度为6370km
你好, 卫星是指在围绕一颗行星轨道并按闭合轨道做周期性运行的天然天体,人造卫星一般亦可称为卫星。人造卫星是由人类建造,以太空飞行载具如火箭、航天飞机等发射到太空中,像天然卫星一样环绕地球或其它行星的装置。中文名:卫星 外文名:Satellite 分类:卫星 分享 概述 卫星是环绕一颗行星按闭合轨道做周...

\\ x表示什么?
\\x是转义字符,告诉编译器需要用特殊的方式进行处理。\\x表示后面的字符是十六进制数,\\0表示后面的字符是八进制数。例如十进制的17用十六进制表示就是‘\\x11’,用八进制表示就是‘\\021’。所有的ASCII码都可以用“\\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\\"来表示常见的那些...

怎么理解地球等效半径
地球等效半径是指电波在传播过程中,其路径上的大气折射效应被等效地替换成了一个没有大气层的球形地球的半径。这样可以使得电波的传播路径被简化为直线,而不需要考虑大气折射的实际影响。具体来说,假设一束电波从A点发出,在B点被接收,在这个过程中,电波的传播路径需要经过大气层。但由于大气折射的...

球重63,连续捡几个区,结果为0,列式为63-7?
63÷7=9。连续减9个7,结果为0。

1到100π的值
1到100π的值:1π=3.14,2π=6.28,3π=9.42,4π=12.56,5π=15.7,6π=18.84,7π=21.98,8π=25.12,9π=28.26,10π=31.4 11π=35.45,12π=37.68,13π=40.83,14π=43.96,15π=47.1,16π=50.24,17π=53.38,18π=56.52,19π=59.66,20π=62.8...

表面积为500万平方厘米的球体的半径是多少?
500万平方厘米=500平方米 球的面积公式:S=4πR²代入500=4*3.14*R² π是圆周率,R是球体半径,因此 R≈6.31米

西安地区第八届青少年科普知识竞赛小学组竞赛题
70、地球的平均半径为63710千米。(×)71、世界上最长的国歌是科威特的国歌。(×)72、我国现代的第一篇白话小说是鲁迅作的《呐喊》× 73、十二生肖中的子时是指23点——1点。(√)74、意大利米兰凯旋门是1807年为纪念拿破仑征服意大利而建的。(√)75、黄山四绝是指奇松、怪石、云海、温泉。(...

地球上方到多少米的时候就没有引力了?
地球半径是6371公里,假如把一个物体在地球表面的引力算作1,而把它移到地球之外的某个地方,引力只有地球表面的万分之一,就算做几乎不再受地球引力影响的话,我们可以算出这个距离大约是63万公里。 但这个距离上的物体并不是不受地球引力作用,一个物体在这个距离上仍然可能被地球引力捕获,围绕地球运动。即使在奥尔特...

地球与太阳之间的距离,应用甚么量度单位。
(三) 秒差距是一种最古老的,同时也是最标准的测量恒星距离的方法。它是建立在三角视差的基础上的。从地球公转轨道的平均半径(一个天文单位,AU)为底边所对应的三角形内角称为视差。当这个角的大小为1秒时,这个三角形(由于1秒的角的所对应的两条边的长度差异完全可以忽略,因此,这个三角形可以想象...

白河县15090399313: 地球的平均半径为6371 -
骆备显克:[答案] 地球平均半径 6371.004千米 地球赤道半径 6378.140千米 地球极地半径 6356.755千米

白河县15090399313: 地球的平均半径约为6371千米,可用科学记数法表示为 米,此时有效数字为 个,精确到 位. -
骆备显克: 地球的平均半径约为6371千米,可用科学记数法表示为 6.371*10的6次方米,此时有效数字为 4个,精确到 千位.

白河县15090399313: 地球的平均半径是多少千米 -
骆备显克: 6371千米. 地球(Earth)是太阳系中由内及外的第三颗行星,是太阳系中直径、质量和密度最大的类地行星,地球自西向东自转,同时围绕太阳公转,距太阳约1.496亿千米.地球表面积5.1亿平方公里,其中71%为海洋,29%为陆地,在太空...

白河县15090399313: 已知地球的平均半径为6371千米,假设在地球的同一纬度上,有两个处于不同经度的城市 -
骆备显克:[答案] #include #define R 6371 main() { int i=0; int j=0; float x1=0; float x2=0; float distance=0; float angle=0; float Perimeter=0; //周长 printf("备注:经度度为东经,请输为正数(东经20度输入为20),西经请输为负数(西经20度输入为-20)\n"); loop:...

白河县15090399313: 地球上同一纬度两地距离计算公式已知地球的平均半径为6371千米,假设在地球的同一纬度上,有两个处于不同经度的城市A、B,请给出两地距离计算公式- - -
骆备显克:[答案] 地球的半径是R,纬度的度数是a,两个城市的经度分别是b1、 b2. 城市所在纬度平面的半径(与赤道面平行)r = Rxcosa; 两城市的距离是纬度平面的弧长,D = (b1-b2)x 3.1416/180 x r.

白河县15090399313: 地球的平均半径为6371千米,已知地球上两个城市A、B的经度和纬度,编程序求出这两个城市之间的地面距离 -
骆备显克: 求出经纬度差,根据cosθ=cosθ1cosθ2求出两城到球心的角的弧度θ,再根据L = θ * R可求球面距离.编程如下,仅是给个思路,考虑不周之处楼主请自行完善.#include <stdio.h>#include <math.h>#include <string> using namespace std; const ...

白河县15090399313: 已知地球半径为6371千米求1)北纬40°和北纬80°分别所在的两个平面之间的距离2)北纬40°和南纬60°分别所在的两个平面之间的距离 -
骆备显克:[答案] 1)答:2179千米 6371*(sin80-sin40)=2179 2)答:9612.65千米 6371*(sin40+sin60)=9612.65

白河县15090399313: 已知地球的平均半径是6371km,求地球表面积( )km² -
骆备显克: S=4πR²=509805890.96km²

白河县15090399313: 已知地球半径约为6371千米.上海的位置约为东经121°、北纬31°,大连的位置约为东经121°、北纬39°,里斯本的位置约为西经10°、北纬39°.(1)若飞机以平... -
骆备显克:[答案] (1)∵上海与大连在同一经线上,∴它们在地球的同一个大圆上. 设地球的球心为O,上海、大连分别为点A、B. 由上海、大连的经、纬度知∠AOB=8°地球半径r≈6371千米 经计算得AB的弧长:6371*π*8°180°≈889.56(千米) 889.56÷720≈1.2(小时...

白河县15090399313: 地球平均半径是6371千米,赤道周长是多少千米? -
骆备显克:[答案] 赤道周长 =2*赤道半径*π =2*6371*3.14 =40 075.24千米 约4万千米

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网