测绘程序实验报告.docx
《测绘程序实验报告.docx》由会员分享,可在线阅读,更多相关《测绘程序实验报告.docx(84页珍藏版)》请在冰点文库上搜索。
测绘程序实验报告
实验一……………………………………………………………………………………2
实验2.2……………………………………………………………………………………5
实验2.3……………………………………………………………………………………7
实验三……………………………………………………………………………………12
实验四……………………………………………………………………………………16
实验五……………………………………………………………………………………19
实验六……………………………………………………………………………………25
实验七……………………………………………………………………………………31
实验八……………………………………………………………………………………37
实验1VisualC++.Net环境和程序设计初步
1.掌握VC++.net语言的基本语法;
2.理解顺序结构、选择结构和循环结构程序设计的特点及应用;
3.掌握对基于对话框的MFC应用程序设计方法;
4.掌握一些简单算法。
5.编写一个方位角计算程序。
提示:
先使用反正切函数计算,然后利用坐标增量
的符号来判断所在的象限。
设计思路:
在按钮下面添加程序。
XY同时大于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;
界面设计:
主要代码:
//0145110615ymh2.1Dlg.h:
头文件
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doublex;
doubley;
doubleQ;
afx_msgvoidOnBnClickedOk();
afx_msgvoidOnBnClickedCancel();
afx_msgvoidOnBnClickedButton1();
doubleA;
};
//0145110615ymh2.1Dlg.cpp:
实现文件
#include"stdafx.h"
#include"0145110615ymh2.1.h"
#include"0145110615ymh2.1Dlg.h"
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
voidCMy0145110615ymh21Dlg:
:
OnBnClickedOk()//计算
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
if(x>0)
{if(y>0)
{Q=1;
A=atan(y/x);}//x大于y大于在第一象限
else{Q=4;
A=atan(y/x)+270;}//x大于y小于在第四象限
}
elseif(y>0)
{Q=2;
A=atan(y/x)+90;}//x大于y小于在第二象限
else{Q=3;
A=atan(y/x)+180;}//x小于y小于在第三象限
UpdateData(FALSE);
//OnOK();
}
voidCMy0145110615ymh21Dlg:
:
OnBnClickedCancel()//清除
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
x=0;
y=0;
Q=0;
A=0;
UpdateData(false);
}
voidCMy0145110615ymh21Dlg:
:
OnBnClickedButton1()//退出
{
//TODO:
在此添加控件通知处理程序代码
OnCancel();
}
运行结果:
总结
第一次做这个实验的时候真的觉得挺难得可是当我经过更难的实验的洗礼之后在返回来看它真是顿时亲切了许多,其实当时是对这个软件不了解简单的东西把它想得很复杂绕来绕去都不知道该怎么实现一些很简单的东西了。
实验2.2.设计同一参考椭球下的三维地心坐标(笛卡儿坐标系)与大地坐标系转换的程
序。
(提示:
用do…while迭代,B、H初始为0进行迭代,直到H的精度达到0.00001
米)
注意:
东经0~180(Y>0),西经:
0~-180(Y<0)
式中,B、L、H为椭球面上的大地纬度、大地经度、大地高;X、Y、Z为空间直
角坐标;N为卯酉圈曲率半径,e为椭球的偏心率,a为椭球的长半径,b为椭球
的短半径。
(WGS84椭球参数:
长半径a=6378137m,扁率α=1/298.257223563)
设计思路:
在按钮下面设置主程序,按照指导书给的思路编辑公式
界面设计:
主要代码:
//0145110615ymh2.2Dlg.h:
头文件
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doubleB;
doubleL;
doubleH;
doubleX;
doubleY;
doubleZ;
afx_msgvoidOnBnClickedOk();
};
//0145110615ymh2.2Dlg.cpp:
实现文件
#include"stdafx.h"
#include"0145110615ymh2.2.h"
#include"0145110615ymh2.2Dlg.h"
#include
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
voidCMy0145110615ymh22Dlg:
:
OnBnClickedOk()//大地坐标转换为空间直角坐标
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
doubler=1/298.257223563;
doublee=sqrt((2*r)-(r*r));
inta=6378137;
doubleW=sqrt(1-e*e*sin(B)*sin(B));
doubleN=a/W;
X=(N+H)*cos(B)*cos(L);
Y=(N+H)*cos(B)*cos(L);
Z=(N*(1-e*e)+H)*sin(B);UpdateData(false);
//OnOK();运行结果:
。
总结
这次实验的主要问题是算出来的结果和老师给的不一样,还有就是空间直角坐标向大地坐标转换的按钮点了没反应我检查了UpdateData(TRUE)和UpdateData(FALSE)也没有忘写到最后我还是没查出问题来,所以想请老师帮我看看什么地方出错了。
实验2.3.编写一个后方交会计算程序。
3.1基本原理及计算公式
若将Pa、Pb、Pc看成权,则P点的坐标即为三个已知点的加权平均值
3.2计算程序设计步骤
(1)设计界面,用于输入3个已知点的坐标和三个观测角a、b和g,以及用
于输出待定点坐标的文本框(12个)、静态标签框和Button按钮;
(2)定义文本框控件变量(Value);
(3)根据已知点计算三个内角A、B、C;
(4)计算Tan(aα)、Tan(β)、Tan(γ)、Tan(A)、Tan(B)、Tan(C);
(5)计算Pa、Pb、Pc;
(6)计算待定点坐标Xp、Yp。
界面要求:
三个坐标输入框,两个角度输入框
一个坐标结果输出框
一个计算按钮,一个清除按钮,一个退出按钮。
2.由三角形三个边长求内角函数
计算公式:
-
+设计思路:
通过示例编辑框添加变量,在按钮下面添加程序。
先将α、β、的度分秒之转换成度利用三角形内角和等于180算出γ并将γ转换成弧度。
接着计算三角形的内角,判断P点是否在危险圆上若不在则计算P点坐标若在则弹出“该点在危险圆上”。
界面设计:
主要代码:
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnEnChangeEdit5();
doubleXA;
doubleYA;
doubleXB;
doubleYB;
doubleXC;
doubleYC;
doublealfa;
doublebet;
doubleXp;
doubleYp;
afx_msgvoidOnBnClickedButton1();
afx_msgvoidOnBnClickedOk();
};
#include"stdafx.h"
#include"dss2-3.h"
#include"dss2-3Dlg.h"
#include
constdoublePI=3.1415926535897932;
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
voidCdss23Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
doubleafAB,afAC,afBC,afBA,afCA,afCB,A,B,C,Pa,Pb,Pc;
intD1,M1,D2,M2;
doubleS1,S2,alfa1,bet1,gama1,alfa2,bet2,gama2;
//将alfa转换成度
D1=int(alfa);
M1=int((alfa-D1)*100);
S1=((alfa-D1)*100-M1)*100;
alfa1=D1+M1/60+S1/3600;
alfa2=alfa1*PI/180;
//将bet转换成度
D2=int(bet);
M2=int((bet-D2)*100);
S2=((bet-D2)*100-M2)*100;
bet1=D2+M2/60+S2/3600;
bet2=bet*PI/180;
//计算gama1的值
gama1=180-bet1-alfa1;
gama2=gama1*PI/180;//将gama1的值转换成弧度
//计算已知点的三个内角
afAB=atan((YB-YA)/(XB-XA));
afAC=atan((YC-YA)/(XC-XA));
afBA=atan((YA-YB)/(XA-XB));
afBC=atan((YC-YB)/(XC-XB));
afCA=atan((YA-YC)/(XA-XC));
afCB=atan((YB-YC)/(XB-XC));
A=afAB-afAC;
B=afBC-afBA;
C=afCA-afCB;
//判断点是否在危险圆上若不在则计算P点坐标
if(alfa+bet+C<170||alfa+bet+C>190)
{
Pa=(tan(alfa2)*tan(A))/(tan(alfa2)-tan(A));
Pb=(tan(bet2)*tan(B))/(tan(bet2)-tan(B));
Pc=(tan(gama2)*tan(C))/(tan(gama2)-tan(C));
Xp=(XA*Pa+XB*Pb+XC*Pc)/(Pa+Pb+Pc);
Yp=(YA*Pa+YB*Pb+YC*Pc)/(Pa+Pb+Pc);
}
else//若在则弹出“该点位于危险圆上”
MessageBox(_T("该点位于危险圆上"));
UpdateData(FALSE);
//OnCancel();
}
voidCdss23Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
XA=0;
YA=0;
XB=0;
YB=0;
XC=0;
YC=0;
alfa=0;
bet=0;
Xp=0;
Yp=0;
UpdateData(FALSE);
//OnOK();
};
运行结果:
总结
本次实验刚开始还是遇到了很多问题的比如说根本不就不知道该如何用程序来实现后方交会这个过程,后来经过问同学、上网查资料等大概弄懂了实现步骤可是写完程序后我发现他根本计算不了点计算按按钮一点反应都没有。
又开始找问题才发现是UpdateData(FALSE)和UpdateData(TRUE)忘写了,还发现程序中没有进行度分秒到度的转换,就顺便把这个实现也加进去了。
这个程序也就算完成了。
实验三数组、指针与函数
一、实验目的
·掌握数组的定义、引用及应用方法。
·掌握指针与动态数组。
·掌握函数的定义、引用及应用方法。
二、实验内容
1.编写一个求任意多边形面积的程序。
提示:
通过界面输入数据,并把数据保存
在一个二维数组或一个一维的自定义结构体类型的数组中,然后再进行计算。
要
求计算部分写成函数的形式,使计算程序与界面无关。
动态数组
创建动态数组
l结构体的定义
多边形面积计算原理及算法
计算原理:
=
面积计算的算法:
L
提示:
显示框用Cedit控件变量
对每个输入的坐标用CStringstr临时变量格式化,然后用CEdit的控件变量插入
设计思路:
将实现写在按钮在下面。
添加顶点下面实现创建动态数组,确认按钮实现返回数组大小值并将添加的数据显示到显示框中去,通过计算按钮实现多边形面积的计算,清除按钮实现清除输入的数据,退出按钮退出程序。
界面设计:
主要代码:
//实现
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
doublex;
doubley;
doubleresult;
CEditedit;
afx_msgvoidOnBnClickedButton4();
afx_msgvoidOnBnClickedButton3();
afx_msgvoidOnBnClickedButton2();
afx_msgvoidOnBnClickedButton1();
afx_msgvoidOnBnClickedButton5();
intn;
double*px;
double*py;
CEditm_strdis;
};
#include"stdafx.h"
#include"0145110615(3).h"
#include"0145110615(3)Dlg.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#endif
//用于应用程序“关于”菜单项的CAboutDlg对话框
doublecalarea(doublex[],doubley[],intn)
{
doubles=0;
inti;
for(i=0;i{
s+=0.5*(x[i]+x[i+1])*(y[i+1]-y[i]);
}
returns;
};
voidCMy01451105173Dlg:
:
OnBnClickedButton4()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
result=calarea(px,py,n);
UpdateData(FALSE);
}
voidCMy01451105173Dlg:
:
OnBnClickedButton3()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
px=newdouble[n];
py=newdouble[n];
UpdateData(FALSE);
}
voidCMy01451105173Dlg:
:
OnBnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
delete[]px;
delete[]py;
px=NULL;
py=NULL;
n=0;
result=0;
m_strdis.SetWindowTextW(_T(""));
UpdateData(FALSE);
}
intt=0;
voidCMy01451105173Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(TRUE);
CStringstr;
t+=1;
if(t>n)
{
MessageBox(_T("Warning!
"));
};
str.Format(_T("No.%d%lf%lf\r\n"),t,x,y);
m_strdis.ReplaceSel(str);
px[t-1]=x;
py[t-1]=y;
UpdateData(FALSE);
}
voidCMy01451105173Dlg:
:
OnBnClickedButton5()
{
//TODO:
在此添加控件通知处理程序代码
exit(0);
}
运行结果:
总结:
这个实验相比前面几个实验感觉难了好多。
首先是不知道怎么实现动态数组也不知道怎样将输入的内容显示到示例编辑框里。
总之在眼前的都是一堆问题,但面临的问题总得解决所以就只能看书、上网查资料、问同学等各种方法来解决问题,最终把问题解决。
实验四类的创建
一、实验目的
1.掌握面向对象编程基本思想
2.掌握VC++.net中创建类
3.掌握建立和使用对象
4.掌握运算符号重载
5.理解类的继承和多态性
二、实验内容
1.设计一个角度类。
要求该类具有度分秒至度的换算、度至度分秒的换算、度与
弧度的换算等功能。
提示:
设置一个角度大小属性,并设定该属性为缺省属性;
另设一个状态属性,表示当前设置的角度大小的形式;度分秒、度、弧度间的相
互转换的方法;定义运算符号(加、减)方法,使得角度类能够像一种普通的数
据类型样的方便使用。
设计思路:
设计一个角度类在类的头文件里申明度到度分秒的转换、度分秒到度的转换、度到弧度的转换、运算符的重载,在类的.cpp文件中写出具体的函数实现,在按钮下面调用类的各个函数来实现角度的转换。
界面设计:
主要代码:
DECLARE_MESSAGE_MAP()
public:
doubledmstodgree(doubledmg);//声明度分秒到度的转换函数
doubledgreetodms(doubledrgree);//声明度到度分秒的转换函数
doubledgreetohd(doubledgree);//声明度到弧度的转换函数
};
DECLARE_MESSAGE_MAP()
public:
afx_msgvoidOnBnClickedCancel();
doubledgree;
doubledms;
doublehd;
afx_msgvoidOnBnClickedButton1();
afx_msgvoidOnBnClickedButton2();
afx_msgvoidOnBnClickedButton3();
afx_msgvoidOnBnClickedOk();
};
voidCymh4Dlg:
:
OnBnClickedCancel()
{
//TODO:
在此添加控件通知处理程序代码
OnCancel();
}
voidCymh4Dlg:
:
OnBnClickedButton1()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
Anglesf;
sf.dgreetodms(dgree);
UpdateData(false);
}
voidCymh4Dlg:
:
OnBnClickedButton2()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
Anglesf;
sf.dmstodgree(dms);
UpdateData(false);
}
voidCymh4Dlg:
:
OnBnClickedButton3()
{
//TODO:
在此添加控件通知处理程序代码
UpdateData(true);
Anglesf;
sf.dgreetohd(dgree);
UpdateData(false);
}
voidCymh4Dlg:
:
OnBnClickedOk()
{
//TODO:
在此添加控件通知处理程序代码
//OnOK();
UpdateData(true);
dgree=0;
dms=0;
hd=0;
UpdateData(false);
}
运行结果:
这个实验调试最终没有