测绘程序实验报告
实验1 Visual C++.Net环境和程序设计初步
1.掌握VC++ 语言的基本语法;
2.理解顺序结构、选择结构和循环结构程序设计的特点及应用;
3.掌握对基于对话框的MFC 应用程序设计方法;
4.掌握一些简单算法。
5.编写一个方位角计算程序。提示:先使用反正切函数计算,然后利用坐标增量
的符号来判断所在的象限。
设计思路:在按钮下面添加程序。X Y同时大于0在第一象限,方位角等于arctan(y/x);X>0,Y<0在第二象限,方位角等于arctan(y/x)+90;X<0,Y<0在第三象限,方位角等于arctan(y/x)+180;X<0,Y>0在第四象限,方位角等于arctan(y/x)+270;
界面设
计:
主要代
码:计同
一参考椭
球下的三
维地心坐
标(笛卡
儿坐标
系)与大
地坐标系
转换的程
序。
(提示:用do…while 迭代,B、H 初始为0 进行迭代,直到H 的精度达到米)
注意:东经0~180(Y>0),西经:0~-180(Y<0)
式中,B、L、H 为椭球面上的大地纬度、大地经度、大地高;X、Y、Z 为空间直
角坐标;N 为卯酉圈曲率半径,e 为椭球的偏心率,a 为椭球的长半径,b 为椭球的短半径。(WGS84 椭球参数:长半径a=6378137m,扁率α=1/)
设计思路:在按钮下面设置主程序,按照指导书给的思路编辑公式
界面设
计:
主要代
码:
写一个后方交会计算程序。
基本原理及计算公式
若将Pa、Pb、Pc 看成权,则P 点的坐标即为三个已知点的加权平均值
计算程序设计步骤
(1)设计界面,用于输入 3 个已知点的坐标和三个观测角、和,以及用
于输出待定点坐标的文本框(12 个)、静态标签框和Button 按钮;
(2)定义文本框控件变量(Value);
(3)根据已知点计算三个内角A、B、C;
(4)计算Tan(α)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);
(5)计算Pa、Pb、Pc;
(6)计算待定点坐标Xp、Yp。
界面要求:
三个坐标输入框,两个角度输入框
一个坐标结果输出框
一个计算按钮,一个清除按钮,一个退出按钮。
2.由三角形三个边长求内角函数
计算公式:
设计思路:通过示例编辑框添加变量,在按钮下面添加程序。先将α、β、的度分秒之转换成度利用三角形内角和等于180算出γ并将γ转换成弧度。接着计算三角形的内角,判断P点是否在危险圆上若不在则计算P点坐标若在则弹出“该点在危险圆上”。界面设计:
主要代码:protected: HICON m_hIcon;
写一个求任意多边形面积的程序。提示:通过界面输入数据,并把数据保存
在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。要
求计算部分写成函数的形式,使计算程序与界面无关。
动态数组
创建动态数组
结构体的定义
多边形面积计算原理及算法
计算原理:
面积计算的算法:
提示:显示框用Cedit 控件变量
对每个输入的坐标用CString str 临时变量格式化,然后用CEdit 的控件变量插入
设计思路:将实现写在按钮在下面。添加顶点下面实现创建动态数组,确认按钮实现返回数组大小值并将添加的数据显示到显示框中去,通过计算按钮实现多边形面积的计算,清除按钮实现清除输入的数据,退出按钮退出程序。
界面设
计:
主要代
码:"
#include
"05(3)"
#ifdef
_DEBUG
#define
new
DEBUG_NEW
#endif
d % lf %lf \r\n"),t,x,y);
(str);
px[t-1]=x;
py[t-1]=y;
UpdateData(FALSE);
}
void CMy073Dlg::OnBnClickedButton5() {
掌握面向对象编程基本思想
2. 掌握VC++ 中创建类
3. 掌握建立和使用对象
4. 掌握运算符号重载
5. 理解类的继承和多态性
二、实验内容
1.设计一个角度类。要求该类具有度分秒至度的换算、度至度分秒的换算、度与
弧度的换算等功能。提示:设置一个角度大小属性,并设定该属性为缺省属性;
另设一个状态属性,表示当前设置的角度大小的形式;度分秒、度、弧度间的相
互转换的方法;定义运算符号(加、减)方法,使得角度类能够像一种普通的数
据类型样的方便使用。
设计思路:设计一个角度类在类的头文件里申明度到度分秒的转换、度分秒到度的转换、度到弧度的转换、运算符的重载,在类的.cpp文件中写出具体的函数实现,在按钮下面调用类的各个函数来实现角度的转换。
界面设
计:
主要代
码:
DECLARE_MESSAGE_MAP()
public:
double dmstodgree(double dmg);编制简单的Cass 数据文件进行数据整理的程序。整理后的数据文件中要求无
重复点数据,且数据按点号大小的升序进行排序。要求整理后的数据按与原始数
据文件同样的格式保存为另外一个文件
示例数据“民用园燃气.dat”文件数据格式:
总点数
点号,编码,X,Y,H
…
例如:
要求:
a.用SaveFileDialog和OpenFileDialog控件获取文件打开或保存的文件
名。
b.自定义一个测量点数据结构体,其元素包括:点号,编码,X,Y,H
c.用文本框显示原始数据和整理后的数据
d..按编程规范进行编码
a. 读数据、保存数据、判断一个点数据是否已经存在、排序、在文本框中
显示文件内容等可以分别定义成一个子过程或函数。
c.编程技巧
打开文件
获得总点数根据点数调整数组的大
逐行读取数据,判断该点是否已经存在数组
中,若不存在,则把该数据存放在数组中
根据删除重复点后的总点
数,重新调整数组大小
按点号大小的升序排序
按原数据格式输出到另外一个文件
设计思路:在按钮下面设置主程序。通过打开文件按钮将原文件打开并显示到示例编辑框内,通过保存文件按钮实现对文件分行、删除重复点、排序、保存更改后的文件并把它显示到示例编辑框中等操作。
界面设
计:
主要代
码:
xt"));at"));umber=_ttoi(strTmp[0]);oder=strTmp[1];
pPoint[i].X=_tstof(strTmp[2]);
pPoint[i].Y=_tstof(strTmp[3]);
pPoint[i].H=_tstof(strTmp[4]);
}
if(strTmp!=NULL)umber=pPoint[j].number)
delete [] pPoint;
umber>pPoint[j].number)
{
t=pPoint[i].number;pPoint[j].number=t;pPoint[i].number=pPoint[j].number;
}
}
}
umber,pPoint[i].coder,pPoint[i].X,pPoint[i].Y,pPoint[i].H);
}
xiugai=xiugai+strOutPut;列数据为一变形监测点的24 期位移监测结果(分别为X,Y,H),编制程序绘
制出该点的变形曲线图,每个方向一个位移序列图。
设计思路:用类DeformationCurve实现原始文件的读入、文件的拆分、画图等功能,调用类的相关函数来实现相应的功能。
界面设计:因为是基于当文本的所以没有界面
主要代码:class DeformationCurve : public CWnd
{
DECLARE_DYNAMIC(DeformationCurve)
public:
DeformationCurve();
virtual ~DeformationCurve();
protected:
DECLARE_MESSAGE_MAP()
public:
CString *DeformationCurve::Splitstring(CString str,char split,int &isubstr);
void DeformationCurve::ReadData(double *&X,double *&Y,double *&H);
void DeformationCurve::Draw(CDC* pDC,CRect& rect);
};
xt"));f"), pDC->TextOutW(dOrgX-60,dEndY+i*dy,str);
}
for(int i=0;i<=3;i++)
{
(_T("%.3f"), pDC->TextOutW(dOrgX-120,dEndY+i*dy,str);
}
for(int i=0;i<=3;i++)
{
(_T("%.3f"), pDC->TextOutW(dOrgX=180,dEndY+i*dy,str); }
();
=dOrgX+i*dx;
ptX[i].y=dOrgY-int((X[i]/*3*dy);
}
pDC->Polyline(ptX,24);=dOrgX+i*dx;
ptY[i].y=dOrgY-int((Y[i]+/*3*dy);
}
pDC->Polyline(ptY,24);
=dOrgX+i*dx;
ptH[i].y=dOrgY-int((H[i]*3*dy));
}
pDC->Polyline(ptH,24);
trN ame=pstrData[0];
m_pKnownPoint[i].strID=pstrData[0];
m_pKnownPoint[i].H=_tstof(pstrData[1]);
m_pKnownPoint[i].flag=1;trName=pstrData[i];
m_pUnknownPoint[i].strID=pstrData[i];
m_pUnknownPoint[i].H=0;lag=0;pBackObj=SearchPointUsingID(pstrData[0]);pFrontObj= SearchPointUsingID(pstrData[1]);ObsValue=_tstof(pstrData[2]);ist=_tstof(pstrData[3]);trID== ID)
{return &m_pKnownPoint[i];}
}
return NULL;
}
trID==ID)
{return &m_pUnknownPoint[i];}
}
return NULL;
}
LevelControlPoint* AdjustLevel::SearchPointUsingID(CString ID)
{
LevelControlPoint* cp;
cp=SearchKnownPointUsingID(ID);
if(cp==NULL)
cp=SearchUnknownPointUsingID(ID);
return cp;
}
void AdjustLevel::ApproHeignt(void)lag!=1)
{
pFrontObj->strID==m_pUnknownPoint[i].strID)
&& m_pDhObs[j].cpBackObj->flag==1 )
{ =m_pDhObs[i].cpBackObj->H - m_pDhObs[i].ObsValue;*/
m_pUnknownPoint[i].H=m_pDhObs[j].cpBackObj->H + m_pDhObs[j].HObsValue;
m_pUnknownPoint[i].flag=1;
break;
}
}
if(m_pUnknownPoint[i].flag!=1)pBackObj->strID==m_pUnknownPoint[i].strID)
&& m_pDhObs[j].cpFrontObj->flag==1 )
{ =m_pDhObs[j].cpFrontObj->H-m_pDhObs[j].HObsValue;
/*
m_pUnknownPoint[i].H=m_pDhObs[i].cpFrontObj->H+m_pDhObs[i].ObsValue;*/
m_pUnknownPoint[i].flag=1;
break;
}
}
}
}
if(i==m_iUnknownPointCount-1)lag!=1)ist);
p(i,i)=value;
}
return p;
}
void AdjustLevel::FormErrorEquation(CMatrix &B, CMatrix &L)
{
(m_iDhObsCount,m_iUnknownPointCount);
(m_iDhObsCount,1);
for(int i=0;i
tmpFront=SearchPointUsingID(m_pDhObs[i].cpFrontObj->strID);
trID==tmpBack->strID)trID==tmpFront->strID)bsValue-(m_pDhObs[i].cpBackObj->H-m_p DhObs[i].cpFrontObj->H);*/
L(i,0)=m_pDhObs[i].HObsValue-(m_pDhObs[i].cpFrontObj->H - m_pDhObs[i].cpBackObj->H);
(_T("%.3f"),L(i,0));
L(i,0)=_tstof(tmp);
L(i,0)=L(i,0)*1000;+=x(i,0);xt"));xt"));
if()==IDCANCEL) return;
CString strFileName=();
setlocale(LC_ALL,"");
CStdioFile sf;
if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;
(LevleContent);
();
UpdateData(FALSE);
}
void CIndircLelveDlg::OnBnClickedComputelevel()
{
f\r\n"), [i].strID,[i].H);
LevleContent+=Temp;
}
(_T("单位权中误差:%.1f mm\r\n"),r0*1000);
LevleContent+=Temp;
LevleContent+=_T("未知点高程中误差(mm):\r\n");
for(int i=0;i< ;i++)
{
();
(_T("%s,%.1f\r\n"),[i].strName,Qx[i]*1000);
LevleContent+=Temp;
}
UpdateData(false);
}
void CIndircLelveDlg::OnBnClickedSavelevleresult()
{
xt"));
if()==IDCANCEL) return;
CString strFileName=();
setlocale(LC_ALL,"");
CStdioFile sf;
if(!(strFileName, CFile::modeCreate|CFile::modeWrite)) return;
(LevleContent);
();
UpdateData(FALSE); }
实验结果
打开文件数据:
平差结果:
四、实验心得
这从实验是我们测绘程序设计的最后一次实验,虽然这个学期我们做了好几次相关的实验,但是我却发现自己学的东西也越来越模糊,感觉很多内容都不理解。这次的实验很大程度上我都是按照《测绘程序设计》上面单导线简易计算来编的,在加上后面的关于水准网间接平差的误差方程和法方程,以及精度评定的相关函数,来完成的。而自己主要完成的就是水准网的数据读取,保存的操作,由于这部分主要用的知识是文件的读取的,因为前面做过,所以不是太难。但是这并不意味着这次实验很简单,至少在我心中这的确比较难,因为里面很多东西不是纯粹的把代码写上去就可以完成,还要靠自己做相应的代码对应,才能够真正的得到想要的结果。但学好编程并扎实的为自己所用是需要更多的学习和练习的,我知道在掌握课堂知识的同时,主动的去寻找吸收相关的知识,希望通过本门课程的学习,掌握学习编程的方法,使自己的水平能够更进一步,循序渐进的掌握更多。虽然这门课的实验已经结束,但是我却深深地知道,我们专业对编程的要求很高,而且必须具备较好的编程能力,或许这些日子下来,我学到的不是很多,但是我或多或少明白,编程是一个循序渐进的过程,我想真的能够在这方面有所突破,就更要花时间多花工夫。