测绘程序设计实验报告word文档
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《测绘程序设计()》
上机实验报告
(Visual C++.Net)
班级:
学号:
姓名:
序号:
二零一三年三月
目录
实验1 Visual Basic环境和程序设计初步 (1)
总结 (5)
实验2、控制结构程序设计(方位角计算、坐标转换、后方交会) (6)
总结 (16)
实验1 Visual C++.Net 环境和程序设计初步
一、实验内容
1. 启动与退出VC++.net ,熟悉VC++.net 的开发环境,通过向导生成基于对话
框的应用程序。
使用MSDN 查看命令按钮、标签和文本框的主要属性和方法。
2. 打开Microsoft visual studio 2008 文档,浏览“Visual studio 文档”目录下的内容,并从“Visual studio 文档->Visual C++->示例”目录下下载一个程序,编译并运行之。
3. 设计一个已知三边边长计算三角形面积的程序。
计算模型如下:
海伦公式:))()((c p b p a p p S ---=,其中2
c
b a p ++=
二、设计思路
1、首先,设计一个窗体,上面有三个静态框和三个文本框用于提示和输入三边a,b,c,还要有一个静态框加一个文本框用于输出面积,还要加三个命令按钮,用于计算,清除和退出;
2、然后要对输入的三边进行判断是否合法(即是否可以组成三角形),用if 语句实现,不合法则清零;
3、最后将海伦公式写成代码的形式即可。
三、界面设计如下
:
四、主要代码如下:
#include<math.h>
void CMy006Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
//判断输入是否有误并计算
UpdateData(TRUE);
if(a+b>c&&a+c>b&&b+c>a)
{
double t;
t=(a+b+c)/2;
s=sqrt(t*(t-a)*(t-b)*(t-c));
}
else CMy006Dlg::OnBnClickedButton2();//输入的三边不能构成三角形时则清零UpdateData(FALSE);
}
void CMy006Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
//清除功能
a=0;
b=0;
c=0;
s=0;
UpdateData(FALSE);
}
void CMy006Dlg::OnBnClickedButton3()
{
exit(0);//退出功能
// TODO: 在此添加控件通知处理程序代码
}
五、运行结果如下:
六、实验总结
本次实验比较简单,主要是熟悉一下Virsual Studio 2008的MFC编程环境,了解编译MFC项目的整个流程。
总的来说问题不大,只是有时候因为搞错顺序而导致程序无法运行,,如先添加了代码才发现没有绑定变量尔后才绑定,或者变量属性搞错等等,都会是程序运行出错,还好有老师指点迷津。
另外一点就是,在实现了上述内容以后,如何去优化、美化界面的问题,还有程序的完美性问题也是值得考虑的。
因为是面向对象的程序,所以程序运行中可能会出现的问题都要考虑周全了,如题中,如果输入的三边不能构成一个三角形要如何等等。
总的来说实验比较成功,收获很大。
实验二控制结构程序设计(方位角计算、坐标转换、后方交会)
一、实验内容
1、编写一个方位角计算程序;
2、设计同一参考椭球下的三维地心坐标(笛卡尔坐标系)与大地坐标系转换的程序;
式中,B,L,H为椭球面上的大地维度,大地经度,大地高;X、Y、Z为空间直角坐标;N为卯酉圈曲率半径,e为椭球的偏心率,a为椭球的长半径,b为椭球的短半径。
(WGS84椭球参数:长半径a-6378137m,扁率α=1、298.257223563)
3、编写一个后方交会计算程序:
基本原理及计算公式:
若将Pa,Pb,Pc看成权,则P点的坐标即为三个已知点的加权平均值
二、设计思路
1、方位角计算:
A、窗体上应有四个静态框加文本框用于输入已知点的坐标,还要一个静态框加文
本框用于输出方位角,还要三个命令按钮用于计算、清除和退出;
B、已知两点坐标,求所在线段的方位角,可以用正弦、余弦和正切公式,在这里
我选择用正切公式;
C、求出dx和dy之后,求可以求出角度,但是在不同的象限里的方位角有可能得
到相同的正切值,所以要加以判断,用if 语句,然后就可以求出确切的方位
角了。
2、坐标转换:
A、窗体上要有六个静态框加文本框用于输入或输出大地坐标或者空间坐标,还有
三个命令按钮用于计算、清除和退出,可以加两个静态提示框;
B、笛卡尔坐标转换成大地坐标,用到的是一个迭代公式,当精度达到要求时跳出
循环,所以用do while循环,将H的初始值设为0;大地坐标转化笛卡尔坐标
比较简单,将公式写成代码就可以了;两个转换须注意度分秒和弧度的转换;
3、后方交会:
A、窗体上应有六个静态框加文本框用以输入已知点坐标,三个静态框加文本框用
以输入测得的角度,两个静态框加文本框用以输出待定点坐标,三个按钮用于
计算、清除和退出;
B、已知三点坐标求待定点坐标,根据赫尔默特公式,要知道三角形三个内角,内
角可以根据方位角来求,方位角可用正切公式求得。
故分为三步,第一先求各
边方位角,第二步根据方位角和内角的关系求三个内角,第三步根据内角和测
量得到的α,β,γ求权,接下来就可以根据公式求出待定点坐标了;要注意
三个已知点是否位于危险圆上;须注意度分秒和弧度的转换;
C、在文本框中绑定相应的变量,在按钮中输入相应的代码,调试并运行。
三、界面设计如下:
方位角计算界面:
坐标转换界面:
后方交会界面:
四、主要代码如下:
1、方位角计算:
#include<math.h>
#define PI 3.14159265358979323846
void CMy007Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double dx,dy,A;
dx=x2-x1;
dy=y2-y1;
A=atan(dy/dx);
if(dx>0)
{
if(dy>0)
fang=A;
else if(dy<0)
fang=2*PI+A;
else
fang=0;
}
else if(dx<0)
{
if(dy>0)
fang=PI-A;
else if(dy<0)
fang=PI+A;
else
fang=PI;
}
else
{
if(dy>0)
fang=PI/2;
else
fang=PI*3/2;
}
fang=fang*180/PI;
UpdateData(FALSE);
}
void CMy007Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
x1=0;
y1=0;
x2=0;
y2=0;
fang=0;
UpdateData(false);
}
void CMy007Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
exit(0);
}
2、坐标转换:
void CMy007Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
exit(0);
}
#include<math.h>
#define PI 3.14159265358979323846
const double f=1/298.257223563;
double N,e=sqrt(2*f-f*f); //扁率f,第一偏心率e,卯酉圈半径N
double a=6378137;
void CMy007Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE); //笛卡尔坐标转换为大地坐标
double dH,H0;
double B2,L2,S,S1;
int D,M,D1,M1;
if(fabs(x)>=1e-5)
L=atan(y/x)*180/PI;
else L=0;
if(x>0)
{
L=L;
}
else if(x<0&&y>0) //计算经度
{
L=L+180;
}
else
{
L=L-180;
}
if((fabs(x)>=(1e-5))||(fabs(y)>=(1e-5)))
{
B=atan(z/sqrt(x*x+y*y));
H=0;
do
{
N=a/sqrt(1-e*e*sin(B)*sin(B));
H0=sqrt(x*x+y*y)/cos(B)-N;
B=atan(z/(sqrt(x*x+y*y)*(1-e*e*N/(N+H)))); //迭代运算得到H,B
dH=H0-H;
H=H0;
}
while(fabs(dH)>=(1e-5)); //当H的精度达到.00001时跳出循环
}
else
{
B=0;
N=a/sqrt(1-e*e*sin(B)*sin(B));
H=sqrt(x*x+y*y)/cos(B)-N;
}
B=B*180/PI;
B=B+(1e-10);
L=L+(1e-10);
D=int(B);
D1=int(L);
B2=(B-D)*60; //弧度转换成度分秒格式
L2=(L-D1)*60;
M=int(B2);
M1=int(L2);
S=(B2-M)*60;
S1=(L2-M1)*60;
B=D+M/100+S/(1e4);
L=D1+M1/100+S1/(1e4);
UpdateData(FALSE);
}
void CMy007Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
double b,l,b1,l1;
int D,M,D1,M1;
double S,S1;
D= int(B);
D1 = int(L);
M = int((B - D) * 100);
M1= int((L - D1) * 100);
S = ((B-D) * 100 - M) * 100;
S1 = ((L-D1) * 100 - M1) * 100;
b1= D+ M / 60 + S / 3600; //度分秒转化为弧度
l1= D1 + M/ 60 + S1 / 3600;
b=(b1/180)*PI;
l=(l1/180)*PI;
N=a/sqrt(1-e*e*sin(b)*sin(b));
x=(N+H)*cos(b)*cos(l); //大地测量坐标转化为笛卡尔坐标 y=(N+H)*cos(b)*sin(l);
z=(N*(1-e*e)+H)*sin(b);
UpdateData(FALSE);
}
void CMy007Dlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
x=0;
y=0;
z=0;
L=0;
B=0;
H=0;
UpdateData(FALSE);
}
后方交会:
void CMy23Dlg::OnBnClickedButton2()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE);
XA=0;
YA=0;
XB=0;
YB=0;
XC=0;
YC=0;
a=0;
be=0;
ga=0;
XP=0;
YP=0;
UpdateData(FALSE);
}
void CMy23Dlg::OnBnClickedButton3()
{
// TODO: 在此添加控件通知处理程序代码
exit(0);
}
#include<math.h>
#define PI 3.14159265358979323846
void CMy23Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(TRUE); //后方交会int D, M;
double dS;
double a1,be1,ga1;
double a2,be2,ga2;
double aAB,aAC,aBC,aBA,aCA,aCB,A,B,C,PA,PB,PC;
D = int(a);
M = int((a-D)*100);
dS = ((a-D)*100-M)*100;
a1 = D+M/60+dS/3600;
a2=a1*PI/180;
D = int(be);
M= int((be - D)*100);
dS = ((be- D) * 100 -M) * 100;
be1= D+M/ 60 + dS / 3600;
be2=be1*PI/180;
D = int(ga);
M= int((ga - D) * 100);
dS= ((ga- D) * 100 - M) * 100;
ga1=D+ M/ 60 + dS/ 3600;
ga2=ga*PI/180;
aAB=atan((YB-YA)/(XB-XA));
aAC=atan((YC-YA)/(XC-XA)); //计算各边方位角aBC=atan((YC-YB)/(XC-XB));
aBA=(aAB>180?aAB-180:aAB+180);
aCA=(aAC>180?aAC-180:aAC+180);
aCB=(aBC>180?aBC-180:aBC+180);
A=aAB-aAC;
B=aBC-aBA; //计算各内角
C=aCA-aCB;
if((a+be+C)<170||(a+be+C)>190) //判断是否危险园,否则进行计算
{
PA=(tan(a2)*tan(A))/(tan(a2)-tan(A));
PB=(tan(be2)*tan(B))/(tan(be2)-tan(B));
PC=(tan(ga2)*tan(C))/(tan(ga2)-tan(C));
XP=(PA*XA+PB*XB+PC*XC)/(PA+PB+PC);
YP=(PA*YA+PB*YB+PC*YC)/(PA+PB+PC);
}
else MessageBox(_T("该点位于危险圆上"));
UpdateData(FALSE);
}
五、运行结果
1、方位角计算:
2、坐标转换:
3、后方交会:
六、实验总结
本次实验有三个小实验,现在做完了,也不觉得是很难的事。
有了上一次实验的经验,MFC制作流程是很熟悉了。
主要是计算按钮里的代码。
写代码也不是难事,把公式写出来就是了,注意一下该注意的,比如不同象限里的方位角会有一样的正切值,度分秒与弧度的相互转换,危险圆等等,也不是很困难。
难就难在将代码码进去调试。
我算
是比较粗心的一个人,总有一些小问题没有被发现,跌跌撞撞调试到现在才算完成。
可能装的软件有些问题,0错误0警告的时候还是要运行第二遍才成功,第一遍可是直接停止工作了。
实验中用得比较多的语句是if 语句,这次用了一次do while循环,对于我这种基础不甚牢靠的人来说,又是一个挑战。
再请教了各路高手之后,我终于还是完成了,有种柳暗花明的感觉。
(注:素材和资料部分来自网络,供参考。
请预览后才下载,期待你的好评与关注!)。