⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 forwardintersection.cpp

📁 用于前方交会的计算
💻 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 + -