测绘程序设计基础 实验3 CSU

测绘程序设计基础 实验3 CSU

  • 实验3 函数
  • (交会定点计算程序设计)
    • 一、 实验目的
    • 二、实验内容与要求
    • 三、设计与实现:
      • 3.1 设计思路:
      • 3.2 界面设计:
        • 3.2.1界面
        • 3.2.2控件属性
      • 3.3主要代码:
      • 3.4运行结果
      • 3.5设计技巧:
      • 代码虽多 不要贪杯~

实验3 函数

(交会定点计算程序设计)

(工具:VS2010)

一、 实验目的

• 掌握函数的定义、引用及应用方法

二、实验内容与要求

• 把前方交会、侧边交会、后方交会程序写成函数的形式,然后再通过主程序调用。

三、设计与实现:

3.1 设计思路:

1 在【文件】菜单执行【新建】,选择【项目】。
2 在【项目类型】窗格中,选择【Visual C++】下的“MFC”项。在【模板】窗格中,选择“MFC 应用程序”模板,输入应用名“RS_110_zhang_SY3_01”。按向导创建“RS_110_zhang_SY3_01”的MFC应用程序,应用程序类型为基于对话框。
3 在窗体上放置3个命令按钮,其【Caption】依次为前方交会、后方交会、边长交会,并修改ID。
4 在【资源视图】窗格中的“Dialog”文件右击,插入“Dialog(E)”,出现一个新的对话框,修改对话框ID。共创建4个对话框:
测绘程序设计基础 实验3 CSU_第1张图片
5 设置对话框属性:
以后方交会为例:将2个编辑框依次右击执行【添加变量】,在弹出的【添加成员变量向导】对话框中,【类别】属性更改为“Value”型,【变量类型】属性更改为“CString”类型,将【变量名】依次命名为“strResection”、“strResult”,并修改其ID。
5.1 点击一命令按钮,将其【Caption】属性更改为“计算”。双击命令按钮,进入“void Back::OnBnClickedWorktoback1()”中,添加代码,在该.cpp文件中依次添加函数并辅以说明;另一完成归零功能的命令按钮操作与上类似。
5.2 流程图如下:
测绘程序设计基础 实验3 CSU_第2张图片
6 添加辅助类“Support”:
测绘程序设计基础 实验3 CSU_第3张图片
7 包含头文件:“Back.cpp”“Front.cpp”“Side.cpp”分别在头文件中添加语句
“#include “Support.h””
8 运行和调试程序;
9 保存应用程序。

3.2 界面设计:

3.2.1界面

测绘程序设计基础 实验3 CSU_第4张图片
测绘程序设计基础 实验3 CSU_第5张图片
测绘程序设计基础 实验3 CSU_第6张图片
测绘程序设计基础 实验3 CSU_第7张图片

3.2.2控件属性

测绘程序设计基础 实验3 CSU_第8张图片

3.3主要代码:

3.3.1文件:<Support.h>
#pragma once
class CSupport
{
     
public:
	CSupport(void);
	~CSupport(void);
	int SplitStringArray(CString str, char split, CStringArray& aStr);
	double Process_oppDegree(double dDms);
	double Process_oppD(double dDeg);
	double Back1(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB);
	double Back2(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB);
	double length(double x1,double y1,double x2,double y2);
	double angle(double a,double b,double c);
	double pocess_P(double a,double b);
	double pocess_answer01(double PA,double PB,double PC,double a,double b,double c);
	double Process_Rad(double dx1,double dy1,double dx2,double dy2);
	bool AreYouTriangle(double a,double b,double c);
	void CBack_intersection(CString strResection,CString &strResult);
	void CFore_intersection(CString strFront,CString &strOutFront);
	void CLinear_intersection(CString strSide,CString &strOutSide);
};


3.3.2文件:<Support.cpp>  
包含13个函数,由三个主函数与9个小函数相辅而成。
/***************************************************************************
*  文件名:                                                    *
*                                                                          *
*  描述:封装所有函数的类                                                   *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日        创建              ***                    *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/


/***************************************************************************
*  名字:double CSupport::SplitStringArray(CString str, char split, CStringArray& aStr)   *
*                                                                          *
*  描述:字符串分割函数                                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                    *
*  参数: 1.CString str                                                    *
*         2.char split                                                     *
*         3.CStringArray& aStr                                             *
*  返回值:int类型数据 返回n                                               *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
int CSupport::SplitStringArray(CString str, char split, CStringArray& aStr)
{
     
	int startIdx = 0;
	int idx = str.Find(split, startIdx);
	aStr.RemoveAll();//先清空

	while (-1 != idx)
	{
     
		CString sTmp = str.Mid(startIdx, idx - startIdx);
		aStr.Add(sTmp);
		startIdx = idx + 1;
		idx = str.Find(split, startIdx);
	}
	CString sTmp = str.Right(str.GetLength() - startIdx);
	if (! sTmp.IsEmpty())
		aStr.Add(sTmp);
	return aStr.GetSize();
}


/***************************************************************************
*  名字:double Process_oppD(double dDeg)                                  *
*                                                                          *
*  描述:十进制的角度值--》弧度式方位角                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                    *
*  参数: 1.double dDeg*PI/180                                             *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 返回弧度值                                       *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::Process_oppD(double dDeg)
{
     
	return dDeg*Pi/180;
}


/***************************************************************************
*  名字:Back1(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB)     *
*                                                                          *
*  描述:前方交会的主要公式之一                                            *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                     *
*  参数: 1.double Xa                                                      *
*         2.double Xb                                                      *
*         3.double Ya                                                      *
*         4.double Yb                                                      *
*         5.double dCotA                                                   *
*         6.double dCotB                                                   *
*  返回值:double类型数据 返回xp坐标                                      *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::Back1(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB)
{
     
	
	return (((Xa*dCotB+Xb*dCotA)+(Yb-Ya))/(dCotA+dCotB));
}


/***************************************************************************
*  名字:Back2(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB)     *
*                                                                          *
*  描述:前方交会的主要公式之一                                            *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                      *
*  参数: 1.double Xa                                                      *
*         2.double Xb                                                      *
*         3.double Ya                                                      *
*         4.double Yb                                                      *
*         5.double dCotA                                                   *
*         6.double dCotB                                                   *
*  返回值:double类型数据 返回yp坐标                                       *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::Back2(double Xa,double Xb,double Ya,double Yb,double dCotA,double dCotB)
{
     
	return (((Ya*dCotB+Yb*dCotA)+(Xa-Xb))/(dCotA+dCotB));
}


/***************************************************************************
*  名字:Process_oppDegree(double dDms)                                    *
*                                                                          *
*  描述:度分秒形式--》十进制的角度值                                      *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          ***                       *
*      2019年3月20日      再次调用            ***                       *
*  参数: 1.double dDms                                                    *
*                                                                          *
*                                                                          *
*  返回值:double类型数据 dDeg 返回十进制的角度值                          *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::Process_oppDegree(double dDms)
{
     
	int iDegree,iMin;
	double dSec;
	double dDeg;
	iDegree=int(dDms);
	iMin=int((dDms-iDegree)*100);
	dSec=((dDms-iDegree)*100-iMin)*100;
	dDeg=iDegree+double(iMin)/60+dSec/3600;
	return dDeg;
}


/***************************************************************************
*  名字:double length(double x1,double y1,double x2,double y2)            *
*                                                                          *
*  描述:由(x1,y1)和(x2,y2)计算两点之间距离 长度                         *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                      *
*  参数: 1.double x1                                                      *
*         2.double y1                                                      *
*         3.double x2                                                      *
*         4.double y2                                                      *
*  返回值:double类型数据 返回距离                                         *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::length(double x1,double y1,double x2,double y2)
{
     
	double tmp=((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
	return sqrt(tmp);
}


/***************************************************************************
*  名字:double angle(double a,double b,double c)                          *
*                                                                          *
*  描述:三角形已知a、b、c三边长,计算a,b之间夹角                        *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                    *
*  参数: 1.double a                                                       *
*         2.double b                                                       *
*         3.double c                                                       *
*  返回值:double类型数据 返回夹角                                         *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::angle(double a,double b,double c)
{
     
	return acos((a*a+b*b-c*c)/(2*a*b));
}


/***************************************************************************
*  名字:double pocess_P(double a,double b)                                *
*                                                                          *
*  描述:后方交会的公式之一 求P值                                         *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                    *
*  参数: 1.double a                                                       *
*         2.double b                                                       *
*  返回值:double类型数据 返回P值                                         *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::pocess_P(double a,double b)
{
     
	return ((tan(a)*tan(b))/(tan(a)-tan(b)));
}


/***************************************************************************
*  名字:pocess_answer01(double PA,double PB,double PC,double a,double b,double c)*
*                                                                          *
*  描述:后方交会的公式之一 求xp或yp点位坐标                              *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数          ***                    *
*  参数: 1.double PA                                                      *
*         2.double PB                                                      *
*         3.double PC                                                      *
*         4.double a                                                       *
*         5.double b                                                       *
*         6.double c                                                       *
*  返回值:double类型数据 返回P值                                         *
*                                                                          *
*  注:                                                                    *
/**************************************************************************/
double CSupport::pocess_answer01(double PA,double PB,double PC,double a,double b,double c)
{
     
	return ((PA*a+PB*b+PC*c)/(PA+PB+PC));
}


/***************************************************************************
*  名字:double Process_Rad(double dx1,double dy1,double dx2,double dy2)   *
*                                                                          *
*  描述:4个坐标值--》弧度式方位角                                         *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月8日       创建该函数          ***                     *
*      2019年3月21日      调用                ***                     *
*  参数: 1.double dx1                                                     *
*         2.double dy1                                                     *
*         3.double dx2                                                     * 
*         4.double dy2                                                     * 
*                                                                          *
*  返回值:double类型数据   转换后的rad型方位角                           *
*                                                                          *
*  注:该函数在输入两坐标值相同时,会有一对话框弹出,且此时返回值为0       *
/**************************************************************************/
double CSupport::Process_Rad(double dx1,double dy1,double dx2,double dy2)
{
     
	double dx=dx2-dx1;
	double dy=dy2-dy1;
	double dRad;
	if(dy>0){
     
		if(dx<0){
     
			dRad=atan(dy/dx)+PI;//第二象限
		}
		else if(dx>0){
     
			dRad=atan(dy/dx);//第一象限
		}
		else{
     
			dRad=PI/2;//位于Y轴正方向
		}
	}
	else if(dy<0){
     
		if(dx<0){
     
			dRad=atan(dy/dx)+PI;//第三象限
		}
		else if(dx>0){
     
			dRad=atan(dy/dx)+2*PI;//第四象限
		}
		else{
     
			dRad=PI*3/2;//位于Y轴负方向
		}
	}
	else{
     
		if(dx>0){
     
			dRad=0;//位于X正半轴
		}
		else if(dx<0){
     
			dRad=PI;//位于X负半轴
		}
		else{
     
			AfxMessageBox(_T("您不能输入相同的坐标。"));//(x1,y1)==(x2,y2)的情况  
			return 0;
		}
	}
	return dRad;
}


/***************************************************************************
*  名字:bool CSupport::AreYouTriangle(double a,double b,double c)         *
*                                                                          *
*  描述:判断三条边是否能构成三角形                                        *
*                                                                          *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月22日       创建该函数         ***                    *
*  参数: 1.double a                                                       *
*         2.double b                                                       *
*         2.double c                                                       *
*                                                                          *
*  返回值:bool型                                                          *
*                                                                          *
*  注:暂时仅支持一行数据处理                                              *
/**************************************************************************/
bool  CSupport::AreYouTriangle(double a,double b,double c)
{
     
	return bool(a+b>c&&a+c>b&&b+c>a);
}


/***************************************************************************
*  名字:void  CBack_intersection(CString strResection,CString &strResult) *
*                                                                          *
*  描述:前方交会主函数,调用了SplitStringArray、Process_oppD              *
*   Process_oppDegree、length、angle、pocess_P、pocess_answer01等7个函数  *
*                                                                          *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数         ***                     *
*  参数: 1.CString strResection                                           *
*         2.CString &strResult                                             *
*                                                                          *
*  返回值:CString类型数据   输出坐标(xp,yp)                               *
*                                                                          *
*  注:支持多行数据处理                                                    *
/**************************************************************************/
void CSupport::CBack_intersection(CString strResection,CString &strResult)
{
     
	int iLine;//行数
	CStringArray aStrLine;
	iLine=SplitStringArray(strResection,13,aStrLine);
	if(iLine==0)
	{
     
		AfxMessageBox(_T("请输入数据!"));
	}
	/*
	if(iLine>1)
	{
		AfxMessageBox(_T("当前仅支持处理单行数据"));
	}*/
	 //定义结构体和动态数组
	struct Point2D
	{
     
		double dx1;
		double dy1;
		double dx2;
		double dy2;
		double dx3;
		double dy3;
		double dAlpha;
		double dBeta;
		double dGamma;
		double dAlpha0;
		double dBeta0;
		double dGamma0;
		double dlength[3];
		double dAngel[3];
		double dP[3];
		double dxp;
		double dyp;
		double temp1;
		double temp2;
		double temp3;
		bool dDanger;
	};
	
	Point2D *point= new Point2D[iLine];
	
	//使用Split函数分离,获得坐标
	
	CStringArray aStrTmp;
	
	
	//int i=0;
	int n;
	for(int i=0;i<iLine;i++)
	{
     	
	
	n=SplitStringArray(aStrLine[i],',',aStrTmp);
	point[i].dx1 =_tstof(aStrTmp[0]);
	point[i].dy1 =_tstof(aStrTmp[1]);
	point[i].dx2 =_tstof(aStrTmp[2]);
	point[i].dy2 =_tstof(aStrTmp[3]);
	point[i].dx3 =_tstof(aStrTmp[4]);
	point[i].dy3 =_tstof(aStrTmp[5]);
	
	//读取三个角度并处理,由角度转为十进制的角度再转为弧度制
	point[i].dAlpha =_tstof(aStrTmp[6]);
	point[i].dBeta =_tstof(aStrTmp[7]);
	point[i].dGamma =_tstof(aStrTmp[8]);
	point[i].dAlpha0=point[i].dAlpha;
	point[i].dBeta0=point[i].dBeta;
	point[i].dGamma0=point[i].dGamma;
	point[i].dAlpha=Process_oppD(Process_oppDegree(point[i].dAlpha));
	point[i].dBeta=Process_oppD(Process_oppDegree(point[i].dBeta));
	point[i].dGamma=Process_oppD(Process_oppDegree(point[i].dGamma));
	
	//求三条边的长度
	point[i].dlength[0]=length(point[i].dx1,point[i].dy1,point[i].dx2,point[i].dy2);//(x1,y1)与(x2,y2)之间长度 记为边1
	point[i].dlength[1]=length(point[i].dx1,point[i].dy1,point[i].dx3,point[i].dy3);//(x1,y1)与(x3,y3)之间长度 记为边2
	point[i].dlength[2]=length(point[i].dx2,point[i].dy2,point[i].dx3,point[i].dy3);//(x2,y2)与(x3,y3)之间长度 记为边3
	
	//求角度
	point[i].dAngel[0]=angle(point[i].dlength[0],point[i].dlength[1],point[i].dlength[2]);//边1与边2夹角 角A
	point[i].dAngel[1]=angle(point[i].dlength[1],point[i].dlength[2],point[i].dlength[0]);//边2与边3夹角 角B
	point[i].dAngel[2]=angle(point[i].dlength[0],point[i].dlength[2],point[i].dlength[1]);//边1与边3夹角 角C
	
	//计算P
	point[i].dP[0]=pocess_P(point[i].dAlpha,point[i].dAngel[0]);//求PA
	point[i].dP[1]=pocess_P(point[i].dBeta,point[i].dAngel[1]);//求PB
	point[i].dP[2]=pocess_P(point[i].dGamma,point[i].dAngel[2]);//求PC
	
	//计算xp,yp
	point[i].dxp=pocess_answer01(point[i].dP[0],point[i].dP[1],point[i].dP[2],point[i].dx1,point[i].dx2,point[i].dx3);
	point[i].dyp=pocess_answer01(point[i].dP[0],point[i].dP[1],point[i].dP[2],point[i].dy1,point[i].dy2,point[i].dy3);
	
	//判断数据 判断后方交会是否危险园附近
	point[i].temp1 =point[i].dGamma0+point[i].dBeta0+point[i].dAngel[0]*180/PI;
	point[i].temp2 =point[i].dAlpha0+point[i].dGamma0+point[i].dAngel[1]*180/PI;
	point[i].temp3 =point[i].dAlpha0+point[i].dBeta0+point[i].dAngel[2]*180/PI;
	if((point[i].temp1>170&&point[i].temp1<190)||(point[i].temp2>170&&point[i].temp2<190)||(point[i].temp3>170&&point[i].temp3<190))
		
	{
     
		point[i].dDanger=1;
	}
	else
	{
     
		point[i].dDanger=0;
	}
	
	
    //输出
	
	strResult.Format(_T("%s\t%s\t%s\t\r\n"),
		_T("Yp:"),
		_T("Xp:"),
		_T("   ")
		);
	
	CString strOutput;
	for(int z=0;z<iLine;z++)
	{
     
		if(point[z].dAlpha0+point[z].dBeta0+point[z].dGamma0==360){
     
			if(AreYouTriangle(point[z].dlength[0],point[z].dlength[1],point[z].dlength[2]))
			{
     
				if(point[z].dDanger)
				{
     
					strOutput.Format(_T("%.3lf\t%.3lf\t%s\r\n"),point[z].dxp,point[z].dyp,_T("危险圆"));
					strResult=strResult+strOutput;
				}
				else
				{
     
					strOutput.Format(_T("%.3lf\t%.3lf\t\r\n"),point[z].dxp,point[z].dyp);
					strResult=strResult+strOutput;
				}
			}
			else
			{
     
				strOutput.Format(_T("错误,不能构成三角形\r\n"));
				strResult=strResult+strOutput;
			}
		}
		else 
			{
     
				strOutput.Format(_T("α与β与γ之和非360,错误\r\n"));
				strResult=strResult+strOutput;
			}
	}
	}
	if(point!=NULL)
	{
     
		delete[] point;
		point=NULL;
	}
	
}


/***************************************************************************
*  名字:CFore_intersection(CString strFront,CString &strOutFront)         *
*                                                                          *
*  描述:前方交会主函数,调用了SplitStringArray、Process_oppD              *
*   Process_oppDegree、Back1、Back2等5个函数                              *
*                                                                          *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数         ***                     *
*  参数: 1.CString strFront                                               *
*         2.CString &strOutFront                                           *
*                                                                          *
*  返回值:CString类型数据   输出坐标(xp,yp)                               *
*  注:支持多行数据处理                                                    *
*                                                                          *
/**************************************************************************/
void CSupport::CFore_intersection(CString strFront,CString &strOutFront)
{
     
	int iLine;
	CStringArray aStrLine;
	iLine=SplitStringArray(strFront,13,aStrLine);
	if(iLine==0)
	{
     
		AfxMessageBox(_T("请输入数据!"));
	}

	struct Point2D
	{
     
		double dx1;
		double dy1;
		double dx2;
		double dy2;
		double dAlpha;
		double dBeta;
		double dCotA;
		double dCotB;
		double dxp;
		double dyp;
	};
	
	Point2D *point= new Point2D[iLine];
	
	//使用Split函数分离,获得坐标
	
	CStringArray aStrTmp;
	
	int n;
	for(int i=0;i<iLine;i++)
	{
     	
	n=SplitStringArray(aStrLine[i],',',aStrTmp);
	point[i].dx1 =_tstof(aStrTmp[0]);
	point[i].dy1 =_tstof(aStrTmp[1]);
	point[i].dx2 =_tstof(aStrTmp[2]);
	point[i].dy2 =_tstof(aStrTmp[3]);
	point[i].dAlpha =_tstof(aStrTmp[4]);
	point[i].dBeta =_tstof(aStrTmp[5]);
	
	
	point[i].dCotA=1/tan(Process_oppD(Process_oppDegree(point[i].dAlpha)));
	point[i].dCotB=1/tan(Process_oppD(Process_oppDegree(point[i].dBeta)));

          point[i].dxp=Back1(point[i].dx1,point[i].dx2,point[i].dy1,point[i].dy2,point[i].dCotA,point[i].dCotB);
	point[i].dyp=Back2(point[i].dx1,point[i].dx2,point[i].dy1,point[i].dy2,point[i].dCotA,point[i].dCotB);
	
	//输出
	strOutFront.Format(_T("%s\t%s\t\r\n"),
		_T("Xp:"),
		_T("Yp:"));
	CString strOutput;
	for(int z=0;z<iLine;z++)
	{
     
		if((point[z].dAlpha+point[z].dBeta)<180)
		{
     
		strOutput.Format(_T("%.3lf\t%.3f\t\r\n"),point[z].dxp,point[z].dyp);
		strOutFront=strOutFront+strOutput;
		}
		else
		{
     
		strOutput.Format(_T("错误,alpha+β>180\r\n"));
		strOutFront=strOutFront+strOutput;
		}

	}

	}
	if(point!=NULL)
	{
     
		delete[] point;
		point=NULL;
	}
}

/***************************************************************************
*  名字:CLinear_intersection(CString strSide,CString &strOutSide)         *
*                                                                          *
*  描述:前方交会主函数,调用了SplitStringArray、Process_Rad               *
*   angle、AreYouTriangle等4个函数                                        *
*                                                                          *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日       创建该函数         ***                     *
*  参数: 1.CString strSide                                                *
*         2.CString &strOutSide                                            *
*                                                                          *
*  返回值:CString类型数据   输出坐标(xp,yp)                               *
*                                                                          *
*  注:支持多行数据处理                                                    *
/**************************************************************************/
void CSupport::CLinear_intersection(CString strSide,CString &strOutSide)
{
     
	CSupport j;
	int iLine;
	CStringArray aStrLine;
	iLine=SplitStringArray(strSide,13,aStrLine);
	if(iLine==0)
	{
     
		AfxMessageBox(_T("请输入数据!"));
	}

	struct Point2D
	{
     
		double dx1;
		double dy1;
		double dx2;
		double dy2;
		double dDab;//两点长度
		double dDap;
		double dDbp;

		double dAlphaAB;
		double dAlphaBA;
		double dBAP;
		double dABP;

		double dap;
		double dbp;

		double dxp;
		double dyp;
	};
	
	Point2D *point= new Point2D[iLine];
	
	//使用Split函数分离,获得坐标
	
	CStringArray aStrTmp;
	int n;
	for(int i=0;i<iLine;i++)
	{
     	
	n=SplitStringArray(aStrLine[i],',',aStrTmp);
	point[i].dx1 =_tstof(aStrTmp[0]);
	point[i].dy1 =_tstof(aStrTmp[1]);
	point[i].dx2 =_tstof(aStrTmp[2]);
	point[i].dy2 =_tstof(aStrTmp[3]);
	point[i].dDap =_tstof(aStrTmp[4]);
	point[i].dDbp =_tstof(aStrTmp[5]);
	
	point[i].dDab =length(point[i].dx1,point[i].dy1,point[i].dx2,point[i].dy2);
    point[i].dAlphaAB=Process_Rad(point[i].dx1,point[i].dy1,point[i].dx2,point[i].dy2);
	point[i].dAlphaBA=Process_Rad(point[i].dx2,point[i].dy2,point[i].dx1,point[i].dy1);
	
	point[i].dBAP=angle(point[i].dDab,point[i].dDap,point[i].dDbp);
	point[i].dABP=angle(point[i].dDab,point[i].dDbp,point[i].dDap);

	point[i].dap=point[i].dAlphaAB-point[i].dBAP;
	point[i].dbp=point[i].dAlphaBA+point[i].dABP;

          point[i].dxp=point[i].dx1+point[i].dDap*cos(point[i].dap);
	point[i].dyp=point[i].dy1+point[i].dDap*sin(point[i].dap);
	
	//输出
	strOutSide.Format(_T("%s\t%s\t\r\n"),
		_T("Xp:"),
		_T("Yp:"));
	CString strOutput;
	for(int z=0;z<iLine;z++)
	{
     
		if(AreYouTriangle(point[z].dDab,point[z].dDap,point[z].dDbp))
		{
     
		strOutput.Format(_T("%.3f\t%.3f\t\r\n"),point[z].dxp,point[z].dyp);
		strOutSide=strOutSide+strOutput;
		}
		else
		{
     
		strOutput.Format(_T("错误,不能构成三角形\r\n"));
		strOutSide=strOutSide+strOutput;
		}
	}

	}
	if(point!=NULL)
	{
     
		delete[] point;
		point=NULL;
	}
}


3.3.3文件:< CRS_110_zhang_SY3_01Dlg.cpp>
/***************************************************************************
*  文件名:                             *
*                                                                          *
*  描述:主界面 生成后方、前方、边长交会                                    *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日        创建              ***                     *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/ 
void CRS_110_zhang_SY3_01Dlg::OnBnClickedButton1Back()
{
     
	// TODO: 在此添加控件通知处理程序代码
	Back B;
	B.DoModal ();
}


void CRS_110_zhang_SY3_01Dlg::OnBnClickedButton2Front()
{
     
	// TODO: 在此添加控件通知处理程序代码
	Front B;
	B.DoModal ();
}


void CRS_110_zhang_SY3_01Dlg::OnBnClickedButton3Side()
{
     
	// TODO: 在此添加控件通知处理程序代码
	Side B;
	B.DoModal ();
}


3.3.4文件:<Back.cpp>
/***************************************************************************
*  文件名:                                                       *
*                                                                          *
*  描述:实现后方交会的类                                                   *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日        创建              ***                     *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/
  void Back::OnBnClickedWorktoback1()
{
     
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	CSupport k;
	k.CBack_intersection(strResection,strResult);
	UpdateData(false);
}


void Back::OnBnClickedButton1Zeroing1()
{
     
	// TODO: 在此添加控件通知处理程序代码
	strResection.Format(_T(""));
          strResult.Format(_T(""));
	UpdateData(false);
}


3.3.5文件:<Front.cpp>
/***************************************************************************
*  文件名:                                                      *
*                                                                          *
*  描述:实现前方交会的类                                                   *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日        创建              ***                       *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/
void Front::OnBnClickedWorkFront2()
{
     
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(true);
	CSupport k;
	k.CFore_intersection(strFront,strOutFront);
	UpdateData(false);
}


void Front::OnBnClickedButton1Zeroing2()
{
     
	// TODO: 在此添加控件通知处理程序代码
	strFront.Format(_T(""));
          strOutFront.Format(_T(""));
	UpdateData(false);
}


3.3.6文件:<Side.cpp>
/***************************************************************************
*  文件名:                                                       *
*                                                                          *
*  描述:实现边长交会的类                                                   *
*                                                                          *
*  历史:**日期**         **理由**            **签名**                     *
*      2019年3月20日        创建              ***                    *
*                                                                          *
*  外部过程:                                                              *
*                                                                          *
/**************************************************************************/
void Side::OnBnClickedSide3()
{
     
	UpdateData(true);
	CSupport k;
	k.CLinear_intersection(strSide,strOutSide);
	UpdateData(false);
	// TODO: 在此9添加控件通知处理程序代码
}


void Side::OnBnClickedButton1Side3()
{
     
	strSide.Format(_T(""));
          strOutSide.Format(_T(""));
	UpdateData(false);
}



3.4运行结果

测绘程序设计基础 实验3 CSU_第9张图片
测绘程序设计基础 实验3 CSU_第10张图片
测绘程序设计基础 实验3 CSU_第11张图片

3.5设计技巧:

 创建一个新类“Support”,将用到的函数全部定义为该类的共有函数,再创建对象,调用该类中的函数,使程序变得整洁,寻找修改函数也更加方便。
 在设计之前,要有个整体的框架。提前想好ID及变量名,这样在搭建Dialog时不必纠结,浪费时间,减少错误。此次实验其实也能仅由一个Dialog加多个按钮来完成,不需要多个对话框。而我做之前思路没清晰,搭建过程中不好修改,浪费了一些功夫。
 熟练调用函数、结构体可以大幅度节省时间。
 调用以前自己编写的函数。

代码虽多 不要贪杯~

你可能感兴趣的:(#,C++测绘程序设计基础,测绘程序设计基础实验,中南大学,CSU,C++,测绘实验)