一、设计思路

1.新建一个Function.h文件,在其中声明二维坐标结构体、角度转换函数、方位角计算函数、两点间距离计算函数和三个定点交会函数,并在新建一个Function.cpp文件对函数进行定义(Function.cpp文件中要加入#include "Function.h");

2.在CExercise_4Dlg.cpp文件头处添加 #include "Function.h"

3.计算按钮消息响应函数对交会定点计算函数的调用:

iMethod==1,调用前方交会函数;

iMethod==2,调用测边交会函数;

iMethod==3,调用后方交会函数。

二、主要代码

// function.h : 头文件
#pragma once
struct Point2D    //定义二维坐标结构体
{double X;double Y;
};
double Dms_TO_Rad(double dDms);                         //度分秒转化为弧度制
double Distance(struct Point2D &A,struct Point2D &B);   //计算两点间的距离
double Azimuth(struct Point2D &A,struct Point2D &B);    //计算方位角
struct Point2D ForwardIntersection(struct Point2D &A,struct Point2D &B,double Alpha,double Betta);
//前方交会定点计算
struct Point2D LinearIntersection(struct Point2D &A,struct Point2D &B,double Dap,double Dbp);
//测边交会定点计算
struct Point2D ResctionIntersection(struct Point2D &A,struct Point2D &B,struct Point2D &C,double Alpha,double Betta,double Gamma);
//后方交会定点计算
// function.cpp : 实现文件
#include "StdAfx.h"
#include "Function.h"
#include "math.h"const double PI=4.0*atan(1.0);double Dms_TO_Rad(double dDms)
{double dRad;int iDegree,iMin;double dSec;iDegree=int(dDms);iMin=int((dDms-iDegree)*100);dSec=((dDms-iDegree)*100-iMin)*100;dDms=iDegree+double(iMin)/60+dSec/3600;dRad=dDms/180*PI;return dRad;
}
double Distance(struct Point2D &A,struct Point2D &B)
{double dDistance=0;dDistance=sqrt((A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y));return dDistance;
}
double Azimuth(struct Point2D &A,struct Point2D &B)
{// TODO: 在此添加控件通知处理程序代码double dAzimuth=0;                     //方位角double dx=B.X-A.X;                     //X坐标增量double dy=B.Y-A.Y;                     //Y坐标增量if (dx>0){if (dy>0){dAzimuth=atan(dy/dx);}else if(dy<0){dAzimuth=atan(dy/dx)+PI*2;}elsedAzimuth=0;}else if (dx<0){if(dy>0){dAzimuth=atan(dy/dx)+PI;}else if(dy<0){dAzimuth=atan(dy/dx)+PI;}elsedAzimuth=PI;}else{if(dy>0)dAzimuth=PI/2;else if(dy<0)dAzimuth=3*PI/2;}return dAzimuth;
}
struct Point2D ForwardIntersection(struct Point2D &A,struct Point2D &B,double Alpha,double Betta)
{struct Point2D P;//将度分秒转化为弧度制double dA=Dms_TO_Rad(Alpha);double dB=Dms_TO_Rad(Betta);//计算A,B角余切值double dCotA=1/tan(dA);double dCotB=1/tan(dB);//计算前方交会定位值P.X=((A.X*dCotB+B.X*dCotA)+(B.Y-A.Y))/(dCotA+dCotB);P.Y=((A.Y*dCotB+B.Y*dCotA)+(A.X-B.X))/(dCotA+dCotB);return P;
}
struct Point2D LinearIntersection(struct Point2D &A,struct Point2D &B,double Dap,double Dbp)
{struct Point2D P;double Dab;                            //三角形AB边长Dab=Distance(A,B);double alpha_ab;                       //三角形AB方位角alpha_ab=Azimuth(A,B);double Angle_A;                        //三角形内角AAngle_A=acos((Dab*Dab+Dap*Dap-Dbp*Dbp)/(2*Dab*Dap));double alpha_ap=alpha_ab-Angle_A;P.X=A.X+Dap*cos(alpha_ap);P.Y=A.Y+Dap*sin(alpha_ap);return P;
}
struct Point2D ResctionIntersection(struct Point2D &A,struct Point2D &B,struct Point2D &C,double Alpha,double Betta,double Gamma)
{struct Point2D P;double dA;                             //三角形内角Adouble dB;                             //三角形内角Bdouble dC;                             //三角形内角Cdouble a;                              //三角形边长adouble b;                              //三角形边长bdouble c;                              //三角形边长ca=Distance(C,B);b=Distance(C,A);c=Distance(B,A);dA=acos((b*b+c*c-a*a)/(2*b*c));dB=acos((a*a+c*c-b*b)/(2*a*c));dC=acos((b*b+a*a-c*c)/(2*b*a));double C_TEMP;                        //定义判断是否在危险圆附近的判断变量double B_TEMP;double A_TEMP;C_TEMP=Alpha+Betta+dC;B_TEMP=Alpha+Gamma+dB;A_TEMP=Betta+Gamma+dA;if ((C_TEMP>170)&&C_TEMP<190||(B_TEMP>170)&&B_TEMP<190||(B_TEMP>170)&&B_TEMP<190){P.X=-1;P.Y=-1;return P;                         //坐标是(-1,-1)则在危险圆附近}double Alpha_Rad=Dms_TO_Rad(Alpha);   //度分秒转化为弧度double Betta_Rad=Dms_TO_Rad(Betta);double Gamma_Rad=Dms_TO_Rad(Gamma);double pa=(tan(Alpha_Rad)*tan(dA))/(tan(Alpha_Rad)-tan(dA));double pb=(tan(Betta_Rad)*tan(dB))/(tan(Betta_Rad)-tan(dB));double pc=(tan(Gamma_Rad)*tan(dC))/(tan(Gamma_Rad)-tan(dC));P.X=(pa*A.X+pb*B.X+pc*C.X)/(pa+pb+pc);P.Y=(pa*A.Y+pb*B.Y+pc*C.Y)/(pa+pb+pc);return P;
}
// Exercise_4Dlg.h : 头文件
// CExercise_4Dlg 对话框
class CExercise_4Dlg : public CDialog
{
public://前方交会控件变量double dXA_F;double dYA_F;double dXB_F;double dYB_F;double dAlpha_F;double dBetta_F;double dXP_F;double dYP_F;//测边交会控件变量double dXA_L;double dYA_L;double dXB_L;double dYB_L;double dDap_L;double dDbp_L;double dXP_L;double dYP_L;//后方交会空间变量double dXA_R;double dYA_R;double dXB_R;double dYB_R;double dXC_R;double dYC_R;double dXP_R;double dYP_R;double dAlpha_R;double dBetta_R;double dGamma_R;int iMethod;                          //交会定点类型代号afx_msg void OnBnClickedBtnCal();     //计算按钮afx_msg void OnBnClickedBtnClear();   //重置编辑框数据afx_msg void OnBnClickedCancel();     //退出对话框void ForwardIntersection(double XA,double YA,double XB,double YB,double Alpha,double Betta,double &XP,double &YP);//前方交会定点计算void LinearIntersection(double XA,double YA,double XB,double YB,double Dap,double Dbp,double &XP,double &YP);//测边交会定点计算void ResctionIntersection(double XA,double YA,double XB,double YB,double XC,double YC,double Alpha,double Betta,double Gamma,double &XP,double &YP);//后方交会定点计算
};
// Exercise_4Dlg.cpp : 实现文件
#include "stdafx.h"
#include "Exercise_4.h"
#include "Exercise_4Dlg.h"
#include "Function.h"
CExercise_4Dlg::CExercise_4Dlg(CWnd* pParent /*=NULL*/): CDialog(CExercise_4Dlg::IDD, pParent), dXA_F(116.942)     //构造函数中给定变量初始值, dYA_F(683.295), dXB_F(522.909), dYB_F(794.647), dAlpha_F(59.1042), dBetta_F(56.3254), dXP_F(398.151), dYP_F(413.249), dXA_L(1807.041), dYA_L(719.853), dXB_L(1646.382), dYB_L(830.660), dDap_L(105.983), dDbp_L(159.648), dXP_L(1805.957), dYP_L(825.830), dXA_R(840.134), dYA_R(844.422), dXB_R(1001.542), dYB_R(1620.616), dXC_R(659.191), dYC_R(1282.629), dXP_R(503.702), dYP_R(1500.075), dAlpha_R(-68.0237), dBetta_R(-8.2414), dGamma_R(76.2651), iMethod(1)
{m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CExercise_4Dlg::OnBnClickedBtnCal()
{// TODO: 在此添加控件通知处理程序代码UpdateData(TRUE);struct Point2D A,B,C,P;//定义个二维结构体变量存放A,B,C,P坐标if (iMethod==1){A.X=dXA_F;A.Y=dYA_F;B.X=dXB_F;B.Y=dYB_F;P=ForwardIntersection(A,B,dAlpha_F,dBetta_F);//调用前方交会定点计算函数dXP_F=P.X;dYP_F=P.Y;}else if (iMethod==2){A.X=dXA_L;A.Y=dYA_L;B.X=dXB_L;B.Y=dYB_L;P=LinearIntersection(A,B,dDap_L,dDbp_L);//调用测边交会定点计算函数dXP_L=P.X;dYP_L=P.Y;}else if (iMethod==3){A.X=dXA_R;A.Y=dYA_R;B.X=dXB_R;B.Y=dYB_R;C.X=dXC_R;C.Y=dYC_R;P=ResctionIntersection(A,B,C,dAlpha_R,dBetta_R,dGamma_R);//调用后方交会定点计算函数dXP_R=P.X;dYP_R=P.Y;if ((dXP_R==-1)&&(dXP_R=-1)){MessageBox(_T("在危险圆附近"));}}elseMessageBox(_T("代号输入有误"));UpdateData(FALSE);
}

三、运行结果

交会定点(前方交会、测边交会、后方交会)程序C++代码相关推荐

  1. 交会定点中的三种角度交会法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨海子与风 来源丨 小小卷屋 在山区和地形复杂地区,传统的钢尺量距有困难.因此在山区或通视条件良好 ...

  2. 摄影测量--测边交会

    目 录 第1章 计算公式    1 1.1 排列顺序    1 1.2 计算公式一    2 1.3 排列顺序的判定    3 1.4 计算公式二    3 第2章 精度评定    6 2.1 几何推 ...

  3. STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码

    STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...

  4. STM32+MAX6675利用SPI获取实时温度数据程序及代码

    之前写的STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 模拟spi之前写过 里面的部分代码摘取的正点原子 ...

  5. 单片空间后方交会程序设计(代码共享)

    单片空间后方交会程序设计 1 目的 用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度.本实验的目的在于让学生深入理解单片空 ...

  6. java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)

    原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...

  7. python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例

    Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...

  8. 《程序员代码面试指南第二版》Python实现(个人读书笔记)

    说明 最近在读左神的书---<程序员代码面试指南-IT名企算法与数据结构题目最优解(第二版)>以及看了一些左神的基础.进阶.高频等视频课程,为了记录自己的学习成果,并且方便以后查看,将自己 ...

  9. c语言万年历查询程序代码,C语言 万年历程序(示例代码)

    C语言 万年历程序 原代码:[email protected]:~/c++$ cat 123.c #include #define Mon   1 #define Tues  2 #define We ...

  10. 使用MAP文件快速定位程序崩溃代码行

    作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...

最新文章

  1. 我的puppet web 管理,彻底告别终端模式
  2. Jquery滚动监听和附加导航
  3. Android深度探索--HAL与驱动开发----第十章读书笔记
  4. Delphi第三方组件安装DCU.PAS.DPK.BPL.ActiveX控件
  5. SAP Spartacus pageSlot一览
  6. .mat,.txt,.csv 数据转换为weka中的arff格式及matlab和Weka之间相互转换格式
  7. Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
  8. mysql like BR%._MySQL Like子句
  9. 在线订餐系统php心得体会_基于php的网上订餐系统的设计与实现论文.doc
  10. 五种主流的虚拟化技术
  11. 前端代码更新镜像后,浏览器显示缓存
  12. 易语言新手入门教程第十五课 - QQ自动登录器第三部分
  13. android自定义View之气球碰撞效果
  14. 被遗忘的设计模式——空对象模式(Null Object Pattern)
  15. 使用美国国立医学图书馆编辑的最新版Index Medicus中医学主题词表(MeSH)
  16. Oracle 数据库的备份与恢复
  17. 三种方式让你在 Linux 上玩电子游戏
  18. 了解 Windchill 术语
  19. 报考通信考试有条件吗?要怎么样的条件才能报考通信考试?
  20. Windows中path环境变量的理解

热门文章

  1. 数理统计之 置信区间2
  2. qt中使用日志系统,自定义日志彩色输出,qt日志写入文件,自定义qt日志格式,同时提供Qt日志重定向功能(将qDebug信息输出到界面控件)
  3. 使用Scala实现Either数据结构
  4. 调用函数Fact()来计算m!
  5. python中fact_python中fact函数使用
  6. 关于excle表格中日期时间筛选
  7. 【Linux】Ubuntu20.04 无法访问 http://cn.archive.ubuntu.com 问题记录解决
  8. Android切词工具——BreakIterator(1)
  9. 9/28shell合集
  10. javascript中function前面加(/!/+/-/~的含义