📄 forwardintersection.cpp
字号:
#include<iostream.h>
#define MAX 100
#define PI 3.1415926
#include<math.h>
#include <stdio.h>
#include<string.h>
struct XX{
double AA[MAX];
double BB[MAX];
double RR[MAX];
}aa;//AA[]、BB[]RR[]、分别用来存储角A、B、P
struct JZ{
char *name;//点名
double x;
double y;
double Guancejiao[MAX];
double FWJ[MAX];
};
JZ J1,J2,J3,J4;//J1,J2控制点,J3,J4定向点,J3是J1的定向点,J4是J2的定向点。
JZ P[MAX];
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;
}
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 Liushijinzhijianfa(double a,double b)
{
int c=0;
int d=0;
int p=0;
int q=0;
int w=0;
if(((int)(a*10000)%100)>=((int)(b*10000)%100))
{p=((int)(a*10000)%100)-((int)(b*10000)%100);c=(int)(a*100.0);d=(int)(b*100.0);}
else if((int)(a*100)%100>0) {p=((int)(a*10000))%100+60-((int)(b*10000))%100;c=(int)(a*100.0)-1;d=(int)(b*100.0);}
else { p=((int)(a*10000))%100+60-((int)(b*10000))%100;c=59;a=a-1;d=(int)(b*100.0);}
if(c%100>=d%100)
{q=c%100-d%100;c=(int)(a);d=(int)(b);}
else
{q=c%100+60-d%100;c=(int)(a)-1;d=(int)b;}
w=c-d;
return (double)(w*1.0)+(double)(q)*0.01+(double(p))*0.0001;
}
double LiushijinzhiJiafa(double a,double b)
{
int c=0;
int d=0;
int p=0;
int q=0;
int w=0;
if(((int)(a*10000))%100+((int)(b*10000))%100<60) {p=((int)(a*10000))%100+((int)(b*10000))%100;c=(int)(a*100);d=(int)(b*100);}
else {p=((int)(a*10000))%100+((int)(b*10000))%100-60;q=1;c=(int)(a*100.0);d=(int)(b*100.0);}
if(q+c%100+d%100<60) {q+=(c%100+d%100);c=(int)(c/100);d=(int)(d/100);}
else {q+=(c%100+d%100)-60;w=1;c=(int)(c/100);d=(int)(d/100);}
w+=c+d;
return ((double)(w*1.0)+(double)(q*0.01)+(double)(p*0.0001));
}
double JisuanYZHFWJ(JZ JJ1,JZ JJ3)
{
double a=0.0;
double dotx=0.0;
double doty=0.0;
double YZHFWJ=0.0000;
dotx=JJ3.x-JJ1.x;
doty=JJ3.y-JJ1.y;
if(dotx==0&&doty<0) YZHFWJ=270.0000;
else {
YZHFWJ=atan2(doty,dotx);
if(YZHFWJ<0) YZHFWJ+=2*PI;
if (YZHFWJ>2*PI) YZHFWJ-=2*PI;
YZHFWJ=h_d(YZHFWJ);
}
return YZHFWJ;
}
void JisuanGeFWJ(JZ J1,JZ J3,JZ &J,int m)
{
double e=0.0;
e=JisuanYZHFWJ(J1,J3);
printf("YZHFWJ=");
printf("%.4f\n",e);
for(int i=0;i<m;i++)
{
double temp=J1.Guancejiao[i];
J1.FWJ[i]=LiushijinzhiJiafa(e,temp);
if(J1.FWJ[i]>=360.0000) J1.FWJ[i]-=360.0000;
J.FWJ[i] =J1.FWJ[i];
}
}
void JisuanAABBRR(JZ &J1,JZ &J2,int m,XX &aa)//????
{
double f=0.0;
double g=0.0;
f=JisuanYZHFWJ(J1,J2);cout<<endl;
g=JisuanYZHFWJ(J2,J1);cout<<endl;
for(int i=0;i<m;i++)
{
if(J1.FWJ[i]>=f) aa.AA[i]=Liushijinzhijianfa(J1.FWJ[i],f);
else aa.AA[i]=Liushijinzhijianfa(f,J1.FWJ[i]);
cout<<"aa.AA["<<i<<"]="<<aa.AA[i]<<endl;
if(J2.FWJ[i]>=g) aa.BB[i]=Liushijinzhijianfa(J2.FWJ[i],g);
else aa.BB[i]=Liushijinzhijianfa(g,J2.FWJ[i]);
cout<<"aa.BB["<<i<<"]="<<aa.BB[i]<<endl;
aa.RR[i]=Liushijinzhijianfa(Liushijinzhijianfa(180.0000,aa.AA[i]),aa.BB[i]);
cout<<"aa.RR["<<i<<"]="<<aa.RR[i]<<endl;
}
}
//定义两平面控制点A B及未知点P,按逆时针顺序
//******************************************************
int JiSuan(double AA,double BB,JZ &J1,JZ &J2,JZ &PP)
{
double a=0.0;
double b=0.0;
a=cos(d_h(AA))/sin(d_h(AA));
b=cos(d_h(BB))/sin(d_h(BB));
PP.x=(J1.x*b+J2.x*a-J1.y+J2.y)/(a+b);
PP.y=(J1.y*b+J2.y*a+J1.x-J2.x)/(a+b);
// 计算待求点坐标
return 1;
}
void JianHe(double BB,double RR,JZ &J1,JZ &J2,JZ &PP)
{
JZ Q;
Q.x=0;Q.y=0;
JiSuan(BB,RR,J2,PP,Q);
if(fabs(Q.x-J1.x)<=0.001&&fabs(Q.y-J1.y)<=0.001)
cout<<"检核通过"<<endl;
else cout<<"检核有误,请检查 "<<endl;
}
int ForwardIntersection(double AA,double BB,double RR,JZ &A, JZ &B,JZ &PP)
{
JiSuan(AA,BB,A,B,PP);
JianHe(BB,RR,A,B,PP);
return 1;
}
//**********************************************************************************
void main()
{
int i=0;
int m=0;//用以存储该两个控制点下前方交会方法下待求点个数
/*int n=0;//用以存储该两个控制点下前方交会方法下控制点个数*/
JZ J1,J2,J3,J4,P[MAX];
JZ PP;
cout<<"请输入所求未知点个数m="<<endl;
cin>>m;
cout<<"请输入第一测站点J1点坐标"<<endl;
cout<<"请输入J1点横坐标J1.x="<<endl;
cin>>J1.x;
cout<<"请输入J1点纵坐标J1.y="<<endl;
cin>>J1.y;
for(i=0;i<m;i++)
{
cout<<"请输入J1.Guancejiao["<<i<<"]="<<endl;
cin>>J1.Guancejiao[i];
}
cout<<"请输入第二测站点J2点坐标"<<endl;
cout<<"请输入J2点横坐标J2.x="<<endl;
cin>>J2.x;
cout<<"请输入J2点纵坐标J2.y="<<endl;
cin>>J2.y;
for(i=0;i<m;i++)
{
cout<<"请输入J2.Guancejiao["<<i<<"]="<<endl;
cin>>J2.Guancejiao[i];
}
cout<<"请输入J1点定向点J3点坐标"<<endl;
cout<<"请输入J3点横坐标J3.x="<<endl;
cin>>J3.x;
cout<<"请输入J3点纵坐标J3.y="<<endl;
cin>>J3.y;
cout<<"请输入J2点定向点J4点坐标"<<endl;
cout<<"请输入J4点横坐标J4.x="<<endl;
cin>>J4.x;
cout<<"请输入J4点纵坐标J4.y="<<endl;
cin>>J4.y;
cout<<"输出J1点观测角J1.Guancejiao[]"<<endl;
for(i=0;i<m;i++)
cout<<"J1.Guancejiao["<<i<<"]="<<J1.Guancejiao[i]<<endl;
JisuanGeFWJ(J1,J3,J1,m);//测站点J1,定向点J3
for(i=0;i<m;i++)
{
cout <<"J1.FWJ["<<i<<"]="<<J1.FWJ[i]<<endl;
}
cout<<"输出J2点观测角J2.Guancejiao[]"<<endl;
for(i=0;i<m;i++)
cout<<"J2.Guancejiao["<<i<<"]="<<J2.Guancejiao[i]<<endl;
JisuanGeFWJ(J2,J4,J2,m);//测站点J2,定向点J4
for(i=0;i<m;i++)
{
cout <<"J2.FWJ["<<i<<"]="<<J2.FWJ[i]<<endl;
}
JisuanAABBRR(J1,J2,m,aa);
for(i=0;i<m;i++)
{
if ((aa.AA[i]<=0||aa.AA[i]>=180)||(aa.BB[i]<=0||aa.BB[i]>=180)||(aa.RR[i]<=0||aa.RR[i]>=180))
{ cout <<"不能构成前方交会的三角形条件,请检查第"<<i+1<<"组角度数据"<<endl;
continue;
}
PP.x=0.0;
PP.y=0.0;
ForwardIntersection(aa.AA[i],aa.BB[i],aa.RR[i],J1,J2,PP);
P[i].x=PP.x;cout<<"P["<<i<<"].x="<<P[i].x<<endl;
P[i].y=PP.y;cout<<"P["<<i<<"].y="<<P[i].y<<endl;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -