#include #include #include"DegSwitch.h" #include "Coordinate.h" #i" />
当前位置:文档之家› C++面向对象程序附合导线、解析交会、角度转换类及计算源代码

C++面向对象程序附合导线、解析交会、角度转换类及计算源代码

#include"stdafx.h"#include<iostream>#include<cmath>#include<string>#include"DegSwitch.h"#include"Coordinate.h"#include"LineCalculation.h"using namespace std;const int N=50;void main(){int degree(int a);int coordinate(int b);int linecalculation(int c);char MODE;cout<<"D.角度转换C.解析交会L.附合导线"<<endl<<"MODE(D/C/L):"; cin>>MODE;cout<<endl;int a;switch(MODE){case'D':a=degree(0);break;case'C':a=coordinate(0);break;case'L':a=linecalculation(0);break;}}// 附合导线验算函数int linecalculation(int c){static int A[N][3],AA[3],CAng[N][3];static double ang[N],cang[N],cang2[N],C[N][2],S[N],Ccoo[N][2],dxdy[N][2];double x1,y1,s=0,x=0,y=0,dx,dy,sc_ang,ec_ang;int b=-1,i=0,j=0,n=0,d,m,s0,f_a;char ch1;FILE *fp;fp=fopen("E:\\Mine\\learning\\测量程序设计\\M.txt","r");if(!fp) printf("文件打开失败");;for(i=0;i<3;i++)fscanf(fp,"%d",&AA[i]);fscanf(fp,"%lf %lf",&x1,&y1);for(i=0;i<N;i++)for(j=0;j<3;j++)fscanf(fp,"%d",&A[i][j]);fscanf(fp,"%c",&ch1);for(i=0;i<N;i++)fscanf(fp,"%lf",&S[i]);fclose(fp);DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_s(AA[0],AA[1],AA[2]);LineCalculation *e=new LineCalculation();e->Start(&n,A,ang,S,&s,&x,&y);e->Angle_M(ang,n,b,&f_a,&d,&m,&s0);e->Angle_A(ang,n,b,f_a,S);e->C_Angle(ang,cang,n,b,sc_ang);DegSwitch *q=new DegSwitch;for(i=0;i<n;i++)cang2[i]=q->DMS_Rad(0,0,cang[i]);e->Coordinate_M(Ccoo,S,sc_ang,cang,n,x,y,&dx,&dy);e->Coordinate_A(Ccoo,dxdy,n,dx,dy,S,s);e->Coordinate(C,Ccoo,n,x1,y1);cout<<endl<<"调整后角度值:"<<endl;DegSwitch *u=new DegSwitch;for(i=0;i<n;i++){u->s_DMS(ang[i],&A[i][0],&A[i][1],&A[i][2]);cout<<A[i][0]<<" "<<A[i][1]<<" "<<A[i][2]<<endl;}cout<<endl<<"坐标方位角:"<<endl;for(i=0;i<n;i++){u->s_DMS(cang[i],&CAng[i][0],&CAng[i][1],&CAng[i][2]);cout<<CAng[i][0]<<" "<<CAng[i][1]<<" "<<CAng[i][2]<<endl; }cout<<endl<<"坐标:"<<endl;for(i=0;i<n-1;i++)cout<<C[i][0]<<" "<<C[i][1]<<endl;cout<<n<<endl;/*fp=fopen("e:\\mine\\learning\\测量程序设计\\M2.txt","w");if(!fp) printf("文件创建失败");fprintf(fp,"%s","调整后角度值:\n");for(i=0;i<n;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",A[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标方位角:\n");for(i=0;i<n-1;i++){for(j=0;j<3;j++)fprintf(fp,"%d ",CAng[i][j]);fprintf(fp,"%s"," \n");}fprintf(fp,"%s","坐标:\n");for(i=0;i<n-1;i++){for(j=0;j<2;j++)fprintf(fp,"%lf ",C[i][j]);fprintf(fp,"%s"," \n");}fclose(fp);*/return 0;}// 解析交会验算函数int coordinate(int b){int d1,m1,s1,d2,m2,s2;double xa,ya,xb,yb,xc,yc,xp,yp,ang1,ang2,s;char mode1;cout<<endl<<"1.坐标正算2.坐标反算3.前方交会4.后方交会"<<endl<<"请选择计算方式:"; cin>>mode1;Coordinate *m=new Coordinate();DegSwitch *n=new DegSwitch();switch(mode1){case'1':cout<<"已知点坐标:"<<endl;cin>>xa>>ya;cout<<"距离:"<<endl;cin>>s;cout<<"连线方位角:"<<endl;cin>>d1>>m1>>s1;ang1=n->DMS_Rad(d1,m1,s1);m->C1SA_C2(xa,ya,s,ang1,&xb,&yb);cout<<"所求点坐标:"<<endl<<xb<<" "<<yb<<endl;break;case'2':cout<<"两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;m->C1C2_SA(xa,ya,xb,yb,&s,&ang1);n->Rad_DMS(ang1,&d1,&m1,&s1);cout<<"距离:"<<s<<"m"<<endl;cout<<"方位角:"<<d1<<"度"<<m1<<"分"<<s1<<"秒"<<endl;break;case'3':cout<<"已知两点坐标:"<<endl;cin>>xa>>ya>>xb>>yb;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2A1A2_P(xa,ya,ang1,xb,yb,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;case'4':cout<<"已知三点坐标:"<<endl;cin>>xa>>ya>>xb>>yb>>xc>>yc;cout<<"观测角:"<<endl;cin>>d1>>m1>>s1;cin>>d2>>m2>>s2;ang1=n->DMS_Rad(d1,m1,s1);ang2=n->DMS_Rad(d2,m2,s2);m->C1C2C3_P(xa,ya,xb,yb,xc,yc,ang1,ang2,&xp,&yp);cout<<"所求点坐标:"<<endl<<xp<<" "<<yp<<endl;break;}cout<<endl;return 0;}// 角度转换验算函数int degree(int a){char mode2;double rawdata,result,Xa,Ya,Xb,Yb;int d=0,m=0,s=0;DegSwitch *x=new DegSwitch();cout<<"1.Deg_DMS 2.DMS_Deg 3.Deg_Rad 4.Rad_Deg 5.Rad_DMS 6.DMS_Rad 7.Coo_Angle"<<endl<<"请选择转换方式:";cin>>mode2;cout<<endl<<"请输入原始数据:";switch(mode2){ case'1':cin>>rawdata;x->Deg_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'2':cin>>d>>m>>s;result=x->DMS_Deg(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'3':cin>>rawdata;result=x->Deg_Rad(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'4':cin>>rawdata;result=x->Rad_Deg(rawdata);cout<<endl<<"转换结果:"<<result<<endl;break;case'5':cin>>rawdata;x->Rad_DMS(rawdata,&d,&m,&s);cout<<endl<<"转换结果:"<<d<<" "<<m<<" "<<s<<endl;break;case'6':cin>>d>>m>>s;result=x->DMS_Rad(d,m,s);cout<<endl<<"转换结果:"<<result<<endl;break;case'7':cin>>Xa>>Ya>>Xb>>Yb;result=x->C_A(Xa,Ya,Xb,Yb);cout<<endl<<"转换结果:"<<result<<endl;break;}cout<<endl;return 0;}//附合导线类#include"StdAfx.h"#include<cmath>#include"LineCalculation.h"#include"DegSwitch.h"using namespace std;const double PI=648000;const int N=50;LineCalculation::LineCalculation(void){}LineCalculation::~LineCalculation(void){}// 附合导线-计数、角度转换、原始坐标增量计算函数void LineCalculation::Start(int *n,int A[][3],double ang[],double S[],double *s,double *x,double *y){int i=0,j=0;for(i=0;i<N;i++){if(S[i]==0)break;*n=*n+1;}DegSwitch *m=new DegSwitch();for(i=0;i<N;i++)ang[i]=m->DMS_s(A[i][0],A[i][1],A[i][2]);for(i=0;i<*n;i++)*s=*s+S[i];}// 附合导线-角度闭合差计算函数void LineCalculation::Angle_M(double ang[],int n,int b,int *f_a,int*d,int*m,int*s) //n已知,ang[]中为弧度,起始角、终止角为弧度值{double ec_ang1,sum1=0;for(int i=0;i<n;i++)sum1=sum1+ang[i];ec_ang1=(n-2)*PI;*f_a=sum1-ec_ang1;DegSwitch *x=new DegSwitch();x->s_DMS(*f_a,&(*d),&(*m),&(*s));}// 附合导线-角度闭合差调整函数void LineCalculation::Angle_A(double ang[],int n,int b,int f_a,double S[]){int ff=f_a/n*b;for(int i=0;i<n;i++)ang[i]=ang[i]+ff;int m=0,f1=0,f2=0;for(int j=1;j<n;j++)if(S[j]<=S[m])m=j;if((f_a%n)!=0)if((f_a/n)%2!=0){f1=(f_a%n)/2;f2=f1+1;}else {f1=(f_a%n)/2;f2=f1;}ang[m-1]=ang[m-1]+f1*b;ang[m]=ang[m]+f2*b;}// 附合导线-坐标方位角计算函数void LineCalculation::C_Angle(double ang[],double cang[],int n,int b,double sc_ang){cang[0]=sc_ang+b*(PI-ang[0]);if(cang[0]<0) cang[0]=cang[0]+2*PI;if(cang[0]>2*PI) cang[0]=cang[0]-2*PI;for(int i=1;i<n;i++){cang[i]=cang[i-1]+b*(PI-ang[i]);if(cang[i]<0) cang[i]=cang[i]+2*PI;if(cang[i]>2*PI) cang[i]=cang[i]-2*PI;}}// 附合导线-坐标增量计算函数void LineCalculation::Coordinate_M(double Ccoo[][2],double S[],double sc_ang,double cang[],int n,double x,double y,double*dx,double*dy){int i;DegSwitch *e0=new DegSwitch();sc_ang=e0->DMS_Rad(0,0,sc_ang);Ccoo[0][0]=S[0]*cos(sc_ang);Ccoo[0][1]=S[0]*sin(sc_ang);double xs=0,ys=0;for(i=1;i<n;i++){Ccoo[i][0]=S[i]*cos(cang[i-1]);Ccoo[i][1]=S[i]*sin(cang[i-1]);xs=xs+Ccoo[i][0];ys=ys+Ccoo[i][1];}*dx=xs-x;*dy=ys-y;}// 附合导线-改正后坐标增量计算函数void LineCalculation::Coordinate_A(double Ccoo[][2],double dxdy[][2],int n,double dx,double dy,double S[],double s){for(int i=0;i<n;i++){dxdy[i][0]=dx*S[i]/s;dxdy[i][1]=dy*S[i]/s;Ccoo[i][0]-=dxdy[i][0];Ccoo[i][1]-=dxdy[i][1];}}// 附合导线-各点坐标计算函数void LineCalculation::Coordinate(double C[][2],double Ccoo[][2],int n,double xa,double ya){C[0][0]=xa+Ccoo[0][0];C[0][1]=ya+Ccoo[0][1];int i=0,j=0;for(i=1;i<n;i++)for(j=0;j<2;j++)C[i][j]=C[i-1][j]+Ccoo[i][j];}// 解析交会类#include"StdAfx.h"#include"Coordinate.h"#include<cmath>#include"DegSwitch.h"using namespace std;Coordinate::Coordinate(void){}Coordinate::~Coordinate(void){}// 解析交会-坐标正算函数void Coordinate::C1SA_C2(double xa,double ya,double s,double ang,double*xb,double*yb){*xb=xa+s*cos(ang);*yb=ya+s*sin(ang);}// 解析交会-坐标反算函数void Coordinate::C1C2_SA(double xa,double ya,double xb,double yb,double*s,double*ang) {DegSwitch*x=new DegSwitch();*s=sqrt(pow((xb-xa),2)+pow((yb-ya),2));*ang=x->C_A(xa,ya,xb,yb);}// 解析交会-前方交会函数void Coordinate::C1C2A1A2_P(double xa,double ya,double ang1,double xb,double yb,doubleang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);*xp=(xa*a+xb*b+(yb-ya)*a*b)/(a+b);*yp=(ya*a+yb*b+(xa-xb)*a*b)/(a+b);}// 解析交会-后方交会函数void Coordinate::C1C2C3_P(double xa,double ya,double xb,double yb,double xc,double yc,double ang1,double ang2,double*xp,double*yp){double a=tan(ang1),b=tan(ang2);double tanBP=((yb-ya)/a+(yb-yc)/b+xa-xc)/((xb-xa)/a+(xb-xc)/b-(ya-yc));double BP=atan(tanBP);*xp=xb+((yb-ya)*(1/a-tanBP)-(xb-xa)*(1+tanBP/a))/(1+tanBP*tanBP);*yp=yb+(*xp-xb)*tanBP;}// 角度转换类#include"StdAfx.h"#include<iostream>#include"DegSwitch.h"using namespace std;const double PI=3.1415926;DegSwitch::DegSwitch(void){}DegSwitch::~DegSwitch(void){}//角度转换成度分秒函数void DegSwitch::Deg_DMS(double Deg,int*a,int*b,int*c){int DMS_D=(int)Deg;*a=DMS_D;double DMS_M1=(Deg-DMS_D)*60;int DMS_M=(int)DMS_M1;*b=DMS_M;int DMS_S=int((DMS_M1-DMS_M)*60);*c=DMS_S;}// 度分秒转换成角度函数double DegSwitch::DMS_Deg(int D, int M, int S){double M1=(double)S/60.0+M;double Deg=M1/60.0+D;return Deg;}// 角度转换成弧度函数double DegSwitch::Deg_Rad(double Deg){double Rad=Deg/180.0*PI;return Rad;}// 弧度转换成角度函数double DegSwitch::Rad_Deg(double Rad){double Deg=Rad/PI*180;return Deg;}// 弧度转换成度分秒void DegSwitch::Rad_DMS(double Rad,int*a,int*b,int*c) {double Deg=Rad_Deg(Rad);DegSwitch *D1 ;D1=new DegSwitch();D1->Deg_DMS(Deg,&(*a),&(*b),&*(c));}// 度分秒转换成弧度double DegSwitch::DMS_Rad(int D, int M, int S){double Deg=DMS_Deg(D, M, S);double Rad=Deg_Rad(Deg);return Rad;}// 坐标方位角反算函数double DegSwitch::C_A(double xa, double ya, double xb, double yb) {double ang1=atan((yb-ya)/(xb-xa));double ang;if(xa==xb){if(yb>ya) ang=0;else ang=PI;}if(xb>xa){if(yb>=ya) ang=ang1;else ang=ang1+2*PI;}if(xb<xa)ang=ang1+PI;return ang;}// 度分秒转换成秒函数int DegSwitch::DMS_s(int D, int M, int S){int s=D*3600+M*60+S;return s;}// 秒转换成度分秒函数void DegSwitch::s_DMS(int s,int*D,int*M,int*S) {*S=s%60;*M=(s/60)%60;*D=s/3600;}。

相关主题