ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:156.73KB ,
资源ID:9899237      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9899237.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(附合导线平差程序设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

附合导线平差程序设计报告.docx

1、附合导线平差程序设计报告 测量平差程序课程设计(报告)学生姓名:罗正材 学 号:1108030128 专 业:2011级测绘工程指导教师:肖 东 升 一、前言3 二、平差程序的基本要求3 三、平差程序模块化3 四、平差中的重要函数4 五、结论7 六、部分源代码7一、前言 随着测绘科学技术的不断发展,在测量数据的处理中产生很多种平差的方法。在本文中,附合导线近似平差程序是利用C+编程实现的,我们需要将导线网的已知数据信息按照特定的规则输入到.txt文本中,利用C+程序读取文本数据信息后,对其进行一系列的平差计算,最终获得平差后的结果,并以.txt文本的形式输出且保存,这样就可为测量工作提供一定的

2、参考,还能为测绘数据的管理带来帮助。二、平差程序的基本要求 平差程序设计与其它程序设计相同,应当满足一定的要求。(1)程序逻辑结构简单,清晰易读,符合结构化程序设计要求,便于扩展;(2)运算速度快,占用内存小,内外存之间的交换不宜过于频繁;(3)数学模型及计算方法正确、先进,计算结果精度高;(4)适应性强,便于移植,充分考虑各种可能形式,尽量满足不同要求与需要;(5)方便用户,操作简便。数据输入与用户作业方式与习惯相统一,输出明了、齐全;尽量减少手工处理工作量,操作简便;人机交互性要强。 上述要求,既体现在平差程序的总体设计中,也贯穿于平差程序设计的各个环节中。三、平差程序模块化图1四、平差中

3、的重要函数 (一)、角度制与弧度制的相互转化C/C+程序设计中,关于角度的计算以弧度制为单位,而在测量以及具体工作中我们通常习惯以角度制为单位。这样,在数据处理中,经常需要在角度制与弧度制之间进行相互转化。这里,我们利用C/C+数学函数库math.h中的相关函数完成这两种功能。这里,我们使用double类型数据表示角度制数和弧度制数。例如:123度44分58.445秒,用double类型表示为123.4458445,其中分、秒根据小数位确定。在角度制与弧度制的转化中,涉及如下图2所示的两个环节。图21.角度化弧度函数double d_h(double angle) /角度化弧度 double

4、a,b; angle=modf(angle,&a);/a 为提取的度值(int类型),angle为分秒值(小数) angle=modf(angle*100.0,&b); / b为提取的分值(int类型),angle为秒值(小数) return (a+b/60.0+angle/36.0)*(PI+3.0E-16)/180.0;2.弧度化角度函数double h_d(double angle) /弧度化角度 double a,b,c; angle=modf(angle*180.0/(PI-3.0E-16),&a); angle=modf(angle*60.0,&b); angle=modf(ang

5、le*60.0,&c); return a+b*0.01+c*0.0001+angle*0.0001;其中,函数modf(angle,&a)为C语言数学库函数,返回值有两个,以引用类型定义的a返回angle的整数部分,函数直接返回值为angle的小数部分。 (二)近似坐标计算在平面网间接平差计算中,近似坐标计算是非常重要的一项基础工作。近似坐标是否计算成功是间接平差是否可以进行的必要条件。1.两方向交会已知条件:两个点的近似坐标,这两个点到未知点的方位角,如图3所示图3 两方向交会根据图4.2,设,则很容易写出 整理该式,得两方向交会的的计算公式 (4.1)对(4.1)式计算,即可得到未知点的

6、近似坐标。应用中需要注意的是,若两方向值相同或相反,则该式无解。程序中,定义该问题的函数为:int xy0ang(obser &a1,obser &a2)2.三边交会如图4所示,为排除两边长交会的二义性,给出如下三边交会的模型,已知条件:三个点的近似坐标,这三个点到未知点的距离测量值。 图4 三边交会对每条边长测量值,可列出边长条件 计算上式中(a)与(b)和(c)三式的差,消去未知参数的平方项,整理得三边交会的计算公式 (4.2)对(4.2)式计算,即可得到未知点的近似坐标。应用中需要注意的是,若三点位于同一条直线,则该式无解。程序中,定义该问题的函数为:int xy0dist(obser

7、&a,obser &b, obser &c)。3.坐标正算 使用测量正算公式计算控制网的近似坐标。程序中,定义该问题的函数为:int zheng(obser &a)4.角度后方交会 使用测量后方交会计算公式计算控制网的近似坐标。程序中,定义该问题的程序函数为:int houj(obser &a,obser &b, obser &c)5.测角网无定向导线计算无定向导线,主要应用于计算已知控制点不相邻的三角网的近似坐标。基本思想为:先由一个已知点开始,假设一条边的边长与方位角,根据三角网的角度观测值推算其它边的边长与方位角,然后,由任一导线计算,直到计算至另一个已知点为止。假设导线的起点为A,终点

8、为B。这时,计算出的B点坐标必然与已知坐标不同,设A与B的已知坐标为(),B点的计算坐标为B(),则用这些数据可以计算边长的放大系数k和假设方位角的改正数da 其中,为计算方位角的函数。这时,对网中的假设边长和所有由假设边长推算的近似边长进行k倍的放大,对假设方位角和所有由假设方位角推算的近似方位角进行方位角改正。然后应用坐标正算法可以计算三角网中所有点的近似坐标。5、结论:C+在导线平差中的应用在导线网的间接平差程序设计与实现中,通过使用C+编程,采用测量平差中的间接平差的方法,实现了导线网的间接平差,最终得到了导线网中待定数据。在导线网平差的程序应用中,利用已经编好的导线网间接平差程序,对

9、边角网、三角网的实例进行了平差,最终得到导线网的待定数据以及相关的精度评定,通过对这些平差结果的检查,最后,认为此导线网的间接平差程序可以为测量的平差工作提供一些服务。虽然此程序可以完成导线网平差一些工作,但是它还有很多的不足地方需要改进以及完善。平差程序的实现定义了五个结构体(间接平差结构、平面网、平面点、测站、观测值),通过一系列的函数将这五个结构体联系起来,最终完成平差任务。下面阐述一下导线网的间接平差程序实现的基本流程:(1)以DAT文件的形式输入导线网中的已知控制点、测站信息、观测值、测角中误差、测距加、乘常数等所有的已知数据,并且这些数据的输入必须符合前面所提到的数据输入格式;(2

10、) 运用程序读取输入数据文件,通过相应的函数求得待定点的近似坐标;(3)通过相应函数,求取间接平差的结构:误差方程系数阵A、观测权阵P、误差方程常数项l;(4)通过间接平差函数,实现对已经得到的间接平差结构的平差工作。(5)最后,以DAT文件的格式输出并保存平差处理结果,为以后的测量工作提供参考。六、部分源代码:/度分秒化成弧度double DMStoRAD(double dms) int d, m, f; double s; f = dms=0 ? 1 : -1; /0.001秒 4.8481368110953599358991410235795e-9弧度 dms += f * 0.0000

11、001; d = (int)dms; dms = (dms - d) * 100.0; m = (int)dms; s = (dms - m) * 100.0; return (d + m / 60.0 + s / 3600.0) * _TORAD - f * 4.8481368110953599358991410235795e-9;/弧度转“度分秒”double RADtoDMS(double rad) int f = rad = 0 ? 1 : -1; / 符号 /加0.001秒(用弧度表示),化为度 rad = (rad + f * 4.8481368110953599358991410

12、235795e-9) * _TODEG; int d = (int)rad; rad = (rad - d) * 60.0; int m = (int)rad; double s = (rad - m) * 60.0; return d + m / 100.0 + s / 10000.0 - f * 0.0000001; /读入已知点的坐标void ReadKnwData(FILE * in, DyArray * array) char buffer256; double dx,dy; SurPnt pnt; while ( !feof(in) ) fgets(buffer, sizeof(b

13、uffer), in); if ( sscanf(buffer, %s %lf %lf, pnt.name, &pnt.x, &pnt.y) = 3) Add(array, pnt); else break; dx = array-elem1.x - array-elem0.x; dy = array-elem1.y - array-elem0.y; adj.azi0=atan2(dy, dx) + (dy elem3.x - array-elem2.x; dy = array-elem3.y - array-elem2.y; adj.azin=atan2(dy, dx) + (dy elem

14、1.x; adj.y1=array-elem1.y; adj.xn=array-elem2.x; adj.yn=array-elem2.y; Destroy(array);/观测值信息写到动态数组void ReadObsValue(FILE * in, DyArray * array) char buffer256; double dir0,dir1,dist0,dist1; SurPnt pnt;/用于临时保存点的坐标 while ( !feof(in) ) fgets(buffer, sizeof(buffer), in); if( feof(in) ) return; if(sscanf

15、(buffer, %s %s %lf %lf %s %lf %lf, pnt.name, pnt.dir0.name, &dir0, &dist0, pnt.dir1.name, &dir1, &dist1) = 7) pnt.dir0.dv=DMStoRAD(dir0); pnt.dir0.dist=dist0; pnt.dir1.dv=DMStoRAD(dir1); pnt.dir1.dist=dist1; pnt.b=pnt.dir1.dv-pnt.dir0.dv+(pnt.dir1.dv-pnt.dir0.dv 0 ? 1 : 0) * _2PI; Add(array, pnt);/观

16、测值信息写到动态数组 else break;/退出读观测值的循环 /求角度闭合差fbvoid Fb(DyArray * array) double sumb=0.0;/beta求和 for (int i=0; ilength; i+) sumb+=array-elemi.b; adj.fb=adj.azi0+sumb-_PI*array-length-adj.azin; adj.v=-adj.fb/array-length; adj.fb=adj.fb/_PI*180*3600; adj.fr=2*8*sqrt(array-length); if (abs(adj.fb) = adj.fr)

17、strcpy(adj.judge,方位角闭合差超限了!); else strcpy(adj.judge,方位角闭合差没超限);/角度改正void CorrectAngle(DyArray * array) for (int i=0; ilength; i+) array-elemi.b+=adj.v; adj.v=adj.v/_PI*180*3600;/推算方位角void Direct(DyArray * array) SurPnt pnt; /第一个未知边 pnt.dir1.alfa=adj.azi0+array-elem0.b-_PI; pnt.dir1.dist=(array-elem0

18、.dir1.dist+array-elem1.dir0.dist)/2; pnt.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa); pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa); AddDir(array,pnt,0); for(int i=1;ilength-1;i+) pnt.dir1.alfa=array-elemi-1.dir1.alfa+array-elemi.b-_PI; pnt.dir1.dist=(array-elemi.dir1.dist+array-elemi+1.dir0.dist)/2; pn

19、t.dir1.dx=pnt.dir1.dist*cos(pnt.dir1.alfa); pnt.dir1.dy=pnt.dir1.dist*sin(pnt.dir1.alfa); AddDir(array,pnt,i); for(i=0;ilength-1;i+) array-elemi.dir1.alfa=RADtoDMS(array-elemi.dir1.alfa);/alfa转为角度 /坐标增量改正void CorrectDirect(DyArray * array) double sumx=0.0; double sumy=0.0; double sums=0.0; for(int i

20、=0;ilength-1;i+) sumx+=array-elemi.dir1.dx; sumy+=array-elemi.dir1.dy; sums+=array-elemi.dir1.dist; adj.fx=adj.x1+sumx-adj.xn; adj.fy=adj.y1+sumy-adj.yn; adj.fs=sqrt(adj.fx*adj.fx+adj.fy*adj.fy); adj.f=int(sums/adj.fs);/导线全长相对闭合差分母 for( i=0;ilength-1;i+) array-elemi.dir1.dx-=adj.fx*array-elemi.dir1.

21、dist/sums;/坐标增量改正 array-elemi.dir1.dy-=adj.fy*array-elemi.dir1.dist/sums; /解算近似平差坐标void Coordinate(DyArray * array) SurPnt pnt; array-elem0.x=adj.x1; array-elem0.y=adj.y1; for(int i=0;ilength-2;i+) /strcpy(pnt.name,array-elemi+1.name); pnt.x=array-elemi.x+array-elemi.dir1.dx;/ pnt.y=array-elemi.y+ar

22、ray-elemi.dir1.dy; AddCor(array,pnt,i+1); /输出void Print(DyArray * array, FILE * out) double d,m,s; fprintf(out, 方位角闭合差fb=%.0lf秒 %s 角度改正v=%.0lf秒n, adj.fb, adj.judge, adj.v); fprintf(out, 坐标增量闭合差 fx=%.0lfmm fy=%.0lfmm fs=%.0lfmmn, adj.fx*1000, adj.fy*1000, adj.fs*1000); fprintf(out, 导线全长相对闭合差 fs/S=1/%

23、dnn, adj.f); fprintf(out, 坐标方位角n); for (int i=0; ilength-1; i+) d=array-elemi.dir1.alfa; m=(d-(int)d)*100; s=(m-(int)m)*100; fprintf(out, %s-%s=%.0lf%.0lf%.0lfn, array-elemi.name, array-elemi+1.name, d, m, s); fprintf(out, n近似平差坐标n); for (i=1; ilength-1; i+) fprintf(out, %s x=%.3lfm y=%.3lfmn, array

24、-elemi.name, array-elemi.x, array-elemi.y); int main(int argc, char* argv) DyArray pnts; Init(&pnts); char infile255, outfile255; if (argc 2) printf(Enter infile name:n); scanf(%s, infile); else strcpy(infile, argv1); FILE * in = fopen(infile, r); if(in = NULL) printf(File %s cannt open!, infile); r

25、eturn -1; if (argc 3) printf(Enter outfile name:n); scanf(%s, outfile); else strcpy(outfile, argv2); FILE * out = fopen(outfile, w); if(out = NULL) printf(File %s cannt open!, outfile); return -1; /读入已知点的坐标 ReadKnwData(in, &pnts); Init(&pnts); /观测值信息写到动态数组 ReadObsValue(in, &pnts); /求角度闭合差fb Fb(&pnts); /角度改正 CorrectAngle(&pnts); /推算方位角 Direct(&pnts); /坐标增量改正 CorrectDirect(&pnts); /解算近似平差坐标 Coordinate(&pnts); fclose(in); /输出 Print(&pnts, out); fclose(out); Destroy(& pnts); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1