#include
#include
#include
#include
#define MAX 100
#define PI 3.1415926
/////////////////////////////////// 结构体存放B,L,H
struct BLH
{char name1[20];
char name2[20];
double B;
char name3[20];
double L;
char name4[20];
double H;
};
/////////////////////////////// 结构体存放X,Y ,Z
struct XYZ
{char name1[20];
char name2[20];
double X;
char name3[20];
double Y;
char name4[20];
double Z;
};
///////////////////////////////// 文件输入B,L,H
double FILEIN(BLH &b,char *fname)
{
ifstream in(fname,ios::nocreate); // 建立文件流, 并与输入文件名建立关联
if(!in)
{
cout
cout
return 0;
}
in>>b.name1;
in>>b.name2;
in>>b.B;
in>>b.name3;
in>>b.L;
in>>b.name4;
in>>b.H;
in.close();
}
//////////////////////////////////////////////// 文件输入X,Y ,Z
double FILEIN1(XYZ &b,char *fname)
{
ifstream in(fname,ios::nocreate); // 建立文件流, 并与输入文件名建立关联 if(!in) { cout
cout
return 0;
}
in>>b.name1;
in>>b.name2;
in>>b.X;
in>>b.name3;
in>>b.Y;
in>>b.name4;
in>>b.Z;
in.close();
return 1;
}
////////////////////////////////////////////////////////
double d_h(double angle) //角度化弧度
{
double a,b;
angle=modf(angle,&a);
angle=modf(angle*100.0,&b);
return (a+b/60.0+angle/36.0)*(PI+3.0E-16)/180.0;
}
///////////////////////////////////////////////////////////
double h_d(double angle) //弧度化角度
{
double a,b,c;
angle=modf(angle*180.0/(PI-3.0E-16),&a);
angle=modf(angle*60.0,&b);
angle=modf(angle*60.0,&c);
return a+b*0.01+c*0.0001+angle*0.0001;
}
/////////////////////////////////////////// 键盘输入B,L,H
jianpan(BLH &a)
{cout
cin>>a.B;
cout
cout
cin>>a.H;
}
///////////////////////////////////////// 键盘输入X,Y ,Z
jianpan1(XYZ &a)
{
cout
cin>>a.X;
cout
cin>>a.Y;
cout
cin>>a.Z;
}
//////////////////////////////////////////////////////
标系
double B_X(BLH &a)
{double aa[MAX][MAX];
double a1,b1,N,E1,X,Y,Z;
int k,n,m;
char outfilename[20],fname[20];
cout
cout
cout
cin>>m;
if(m==1)
{cout
cin>>fname;
if(FILEIN(a,fname));
else
{if(jianpan(a));
else
{cout
return false;
}
}
}
else if(m==2)
jianpan(a);
else
{cout
return false;}
if(a.B90)
{cout
return false;}
if(a.L360)
{cout
return false;}
if(a.H
{cout
return false;}
aa[0][0]=6378245.0000000000; aa[0][1]=6356863.0187730473;
aa[1][0]=6378140.0000000000; aa[1][1]=6356755.2881575287;
aa[2][0]=6378137.0000000000; aa[2][1]=6356752.3142;
aa[3][0]=6378137.000; aa[3][1]=6356752.314;
cout
cout
cout
cout
cout
cin>>k;
if(k!=0&&k!=1&&k!=2&&k!=3)
{cout
return false;}
couta1=aa[k][0];
b1=aa[k][1];
E1=(a1*a1-b1*b1)/(a1*a1);
a.B=d_h(a.B);
a.L=d_h(a.L);
N=a1/sqrt(1-E1*sin(a.B)*sin(a.B));
X=(N+a.H)*cos(a.B)*cos(a.L);
Y=(N+a.H)*cos(a.B)*sin(a.L);
Z=(N*(1-E1)+a.H)*sin(a.B);
cout
果
cout
cout
cout
cout
cout
cout
cin>>n;
if(n==1)
{cout
果
cin>>outfilename;
ofstream out(outfilename); //选择椭球体 //屏幕输出结 //文件输出结
out.precision(10);
if(!out) cout
out
out
out
out
out
out
out
out.close();
}
else if(n==2);
else
{cout
return false;}
cout
}
////////////////////////////////////////////////////////
////////////////////////////////////////////////////////// 空间直角坐标系换算到
大地坐标系
double X_B(XYZ &a)
{double a1,b1,N,E1,B,L,H,B0,aa[MAX][MAX];
double tanB[MAX][1];
int i=0,n,k,m;
char outfilename[20],fname[20]; //选择数据输
入方式
cout
cout
cout
cin>>m;
if(m==1)
{cout
cin>>fname;
if(FILEIN1(a,fname));
else
{if(jianpan1(a));
else
{cout
return false;
}
}
}
else if(m==2)
jianpan1(a);
else
{cout
return false;}
aa[0][0]=6378245.0000000000; aa[0][1]=6356863.0187730473;
aa[1][0]=6378140.0000000000; aa[1][1]=6356755.2881575287;
aa[2][0]=6378137.0000000000; aa[2][1]=6356752.3142;
aa[3][0]=6378137.000; aa[3][1]=6356752.314;
cout
cout
体
cout
cout
cout
cin>>k;
if(k!=0&&k!=1&&k!=2&&k!=3)
{cout
return false;}
a1=aa[k][0];
b1=aa[k][1];
E1=(a1*a1-b1*b1)/(a1*a1);
L=atan(a.Y/a.X);
tanB[0][0]=a.Z*(1+E1)/sqrt(a.X*a.X+a.Y*a.Y);
do{B0=atan(tanB[i][0]);
tanB[i+1][0]=(1/sqrt(a.X*a.X+a.Y*a.Y)*(a.Z+a1*E1*tanB[i][0]/sqrt(1+(1-E1)*tanB[i][0]*tanB[i]
[0])));
B=atan(tanB[i+1][0]);
i++;
}while(B-B0>0.[**************]);
cout
N=a1/sqrt(1-E1*sin(B)*sin(B));
H=sqrt(a.X*a.X+a.Y*a.Y)/cos(B)-N;
B=h_d(B);
L=h_d(L);
if(a.X
L=180+L;
else if(a.X0)
L=180+L;
else if(a.X>0&&a.Y
L=360+L;
cout
出结果
cout
cout
cout
cout
cout
cout
cin>>n;
if(n==1)
{cout
cin>>outfilename;
ofstream out(outfilename);
out.precision(15);
if(!out) cout
out
out
out
out
out
out
out
out.close();}
else if(n==2);
else
{cout
return false;}
cout
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////
main()
{cout.precision(15);
int m;
BLH a;
XYZ b;
cout
cout
cout
cin>>m;
if(m==1)
B_X(a);
else if(m==2)
X_B(b);
else cout
}