交会定点(前方交会、测边交会、后方交会)程序C++代码
一、设计思路
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++代码相关推荐
- 交会定点中的三种角度交会法
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨海子与风 来源丨 小小卷屋 在山区和地形复杂地区,传统的钢尺量距有困难.因此在山区或通视条件良好 ...
- 摄影测量--测边交会
目 录 第1章 计算公式 1 1.1 排列顺序 1 1.2 计算公式一 2 1.3 排列顺序的判定 3 1.4 计算公式二 3 第2章 精度评定 6 2.1 几何推 ...
- STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码
STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 因为芯片的spi口只有3个,有部分需要外接W25Q128 ...
- STM32+MAX6675利用SPI获取实时温度数据程序及代码
之前写的STM32+MAX6675利用io口模拟SPI获取实时温度数据程序及代码 本文采用的芯片为STM32F103RCT6 温度芯片为MAX6675 模拟spi之前写过 里面的部分代码摘取的正点原子 ...
- 单片空间后方交会程序设计(代码共享)
单片空间后方交会程序设计 1 目的 用程序设计语言(VC或者VB)编写一个完整的单片空间后方交会程序,通过对提供的试验数据进行计算,输出像片的外方位元素并评定精度.本实验的目的在于让学生深入理解单片空 ...
- java mvc框架代码_JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码)
原标题:JAVA技术学习笔记:SpringMVC框架(内附入门程序开发代码) JavaEE体系结构包括四层,从上到下分别是应用层.Web层.业务层.持久层.Struts和SpringMVC是Web层的 ...
- python软件代码示例-用Python写一个模拟qq聊天小程序的代码实例
Python 超简单的聊天程序 客户端: import socket, sys host = '10.248.27.23' # host = raw_input("Plz imput des ...
- 《程序员代码面试指南第二版》Python实现(个人读书笔记)
说明 最近在读左神的书---<程序员代码面试指南-IT名企算法与数据结构题目最优解(第二版)>以及看了一些左神的基础.进阶.高频等视频课程,为了记录自己的学习成果,并且方便以后查看,将自己 ...
- c语言万年历查询程序代码,C语言 万年历程序(示例代码)
C语言 万年历程序 原代码:[email protected]:~/c++$ cat 123.c #include #define Mon 1 #define Tues 2 #define We ...
- 使用MAP文件快速定位程序崩溃代码行
作为程序员,平时最担心见到的事情就是程序发生了崩溃,无论是指针越界还是非法操作,都将给我们的应用系统 造成巨大的损失.但在一个大型系统的测试过程中,初期出现程序崩溃似乎成了不可避免的事.其实测试中出现 ...
最新文章
- 我的puppet web 管理,彻底告别终端模式
- Jquery滚动监听和附加导航
- Android深度探索--HAL与驱动开发----第十章读书笔记
- Delphi第三方组件安装DCU.PAS.DPK.BPL.ActiveX控件
- SAP Spartacus pageSlot一览
- .mat,.txt,.csv 数据转换为weka中的arff格式及matlab和Weka之间相互转换格式
- Codeforces Round #437 (Div. 2, based on MemSQL Start[c]UP 3.0 - Round 2)
- mysql like BR%._MySQL Like子句
- 在线订餐系统php心得体会_基于php的网上订餐系统的设计与实现论文.doc
- 五种主流的虚拟化技术
- 前端代码更新镜像后,浏览器显示缓存
- 易语言新手入门教程第十五课 - QQ自动登录器第三部分
- android自定义View之气球碰撞效果
- 被遗忘的设计模式——空对象模式(Null Object Pattern)
- 使用美国国立医学图书馆编辑的最新版Index Medicus中医学主题词表(MeSH)
- Oracle 数据库的备份与恢复
- 三种方式让你在 Linux 上玩电子游戏
- 了解 Windchill 术语
- 报考通信考试有条件吗?要怎么样的条件才能报考通信考试?
- Windows中path环境变量的理解
热门文章
- 数理统计之 置信区间2
- qt中使用日志系统,自定义日志彩色输出,qt日志写入文件,自定义qt日志格式,同时提供Qt日志重定向功能(将qDebug信息输出到界面控件)
- 使用Scala实现Either数据结构
- 调用函数Fact()来计算m!
- python中fact_python中fact函数使用
- 关于excle表格中日期时间筛选
- 【Linux】Ubuntu20.04 无法访问 http://cn.archive.ubuntu.com 问题记录解决
- Android切词工具——BreakIterator(1)
- 9/28shell合集
- javascript中function前面加(/!/+/-/~的含义