《测量平差程序》课程设计(报告)学生姓名:罗正材学号:1108030128专业:2011级测绘工程指导教师:肖东升目录一、前言 (3)二、平差程序的基本要求 (3)三、平差程序模块化 (3)图1四、平差中的重要函数(一)、角度制与弧度制的相互转化C/C++程序设计中,关于角度的计算以弧度制为单位,而在测量以及具体工作中我们通常习惯以角度制为单位。
这样,在数据处理中,经常需要在角度制与弧度制之间进行相互转化。
这里,我们利用C/C++数学函数库math.h中的相关函数完成这两种功能。
这里,我们使用double类型数据表示角度制数和弧度制数。
例如:123度44分58.445秒,用double类型表示为123.4458445,其中分、秒根据小数位确定。
在角度制与弧度制的转化中,涉及如下图2所示的两个环节。
度.分秒度弧度图21.角度化弧度函数double d_h(double angle) //角度化弧度{ double 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(angle*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,设11αtgk=,22αtgk=,则很容易写出⎪⎩⎪⎪⎨⎧-=--=BPBPAPAPyykxxyyk21整理该式,得两方向交会的的计算公式⎪⎪⎭⎫⎝⎛--=⎪⎪⎭⎫⎝⎛⎪⎪⎭⎫⎝⎛--BBAAPPyxkyxkyxkk212111(4.1)对(4.1)式计算,即可得到未知点的近似坐标。
应用中需要注意的是,若两方向值相同或相反,则该式无解。
程序中,定义该问题的函数为:int xy0ang(obser &a1,obser &a2)2.三边交会如图4所示,为排除两边长交会的二义性,给出如下三边交会的模型,已知条件:三个点的近似坐标,这三个点到未知点的距离测量值。
图4 三边交会 对每条边长测量值,可列出边长条件⎪⎩⎪⎨⎧-+-=-+-=-+-=)()()()()()()()()(222322222221c y y x x S b y y x x S a y y x x S C P C P B P B P A P A P计算上式中(a )与(b )和(c )三式的差,消去未知参数的平方项,整理得三边交会的计算公式⎝⎛++---++---=⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫⎝⎛----22222122232212222A A C C A A B B P P C A CA B A BA y x S y x S y x S y x S y x y y x x y y x x (4.2对(4.2)式计算,即可得到未知点的近似坐标。
应用中需要注意的是,若三点位于同一条直线,则该式无解。
程序中,定义该问题的函数为:int xy0dist (obser &a ,obser &b , obser &c )。
3.坐标正算使用测量正算公式计算控制网的近似坐标。
程序中,定义该问题的函数为:int zheng (obser &a ) 4.角度后方交会使用测量后方交会计算公式计算控制网的近似坐标。
程序中,定义该问题的程序函数为:int houj (obser &a ,obser &b , obser &c ) 5.测角网无定向导线计算无定向导线,主要应用于计算已知控制点不相邻的三角网的近似坐标。
基本思想为:先由一个已知点开始,假设一条边的边长与方位角,根据三角网的角度观测值推算其它边的边长与方位角,然后,由任一导线计算,直到计算至另一个已知点为止。
假设导线的起点为A ,终点为B 。
这时,计算出的B 点坐标必然与已知坐标不同,设A 与B 的已知坐标为(B B A A y x y x ,,,),B 点的计算坐标为B ’('',B B y x ),则用这些数据可以计算边长的放大系数k 和假设方位角的改正数da222'2')()()()(A B A B A B A B y y x x y y x x k -+--+-=),(),(B A afa B A afa d '-=α 其中,),(B A afa 为计算方位角的函数。
这时,对网中的假设边长和所有由假设边长推算的近似边长进行k 倍的放大,对假设方位角和所有由假设方位角推算的近似方位角进行方位角改正。
然后应用坐标正算法可以计算三角网中所有点的近似坐标。
五、结论:C++在导线平差中的应用在‘导线网的间接平差程序设计与实现’中,通过使用C ++编程,采用测量平差中的间接平差的方法,实现了导线网的间接平差,最终得到了导线网中待定数据。
在‘导线网平, int d, m, f; double s; f = dms>=0 ? 1 : -1;//0.001秒 = 4.8481368110953599358991410235795e-9弧度 dms += f * 0.0000001; 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.8481368110953599358991410235795e-9) * _TODEG;int d = (int)rad;rad = (rad - d) * 60.0;int m = (int)rad;dx = array->elem[1].x - array->elem[0].x;dy = array->elem[1].y - array->elem[0].y;adj.azi0=atan2(dy, dx) + (dy < 0 ? 1 : 0) * _2PI;//alfa-0dx = array->elem[3].x - array->elem[2].x;dy = array->elem[3].y - array->elem[2].y;adj.azin=atan2(dy, dx) + (dy < 0 ? 1 : 0) * _2PI;//alfa-nadj.x1=array->elem[1].x;adj.y1=array->elem[1].y;adj.xn=array->elem[2].x;adj.yn=array->elem[2].y;Destroy(array);//}//观测值信息写到动态数组void ReadObsValue(FILE * in, DyArray * array){0)elsebreak;//退出读观测值的循环}}//求角度闭合差fbvoid Fb(DyArray * array){double sumb=0.0;//beta求和for (int i=0; i< array->length; i++){sumb+=array->elem[i].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)pnt.dir1.dist=(array->elem[0].dir1.dist+array->elem[1].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;i<array->length-1;i++){pnt.dir1.alfa=array->elem[i-1].dir1.alfa+array->elem[i].b-_PI;pnt.dir1.dist=(array->elem[i].dir1.dist+array->elem[i+1].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,i);}for(i=0;i<array->length-1;i++){array->elem[i].dir1.alfa=RADtoDMS(array->elem[i].dir1.alfa);//alfa转为角度}{array->elem[i].dir1.dx-=adj.fx*array->elem[i].dir1.dist/sums;//坐标增量改正array->elem[i].dir1.dy-=adj.fy*array->elem[i].dir1.dist/sums;}}//解算近似平差坐标void Coordinate(DyArray * array){SurPnt pnt;array->elem[0].x=adj.x1;array->elem[0].y=adj.y1;for(int i=0;i<array->length-2;i++){//strcpy(,array->elem[i+1].name);pnt.x=array->elem[i].x+array->elem[i].dir1.dx;//pnt.y=array->elem[i].y+array->elem[i].dir1.dy;fprintf(out, "α%s-%s=%.0lf°%.0lf′%.0lf″\n", array->elem[i].name, array->elem[i+1].name,d, m, s);}fprintf(out, "\n近似平差坐标\n");for (i=1; i<array->length-1; i++){fprintf(out, "%s x=%.3lfm y=%.3lfm\n", array->elem[i].name, array->elem[i].x,array->elem[i].y);}}int main(int argc, char* argv[]){DyArray pnts;Init(&pnts);elsestrcpy(outfile, argv[2]);FILE * out = fopen(outfile, "w");if(out == NULL){printf("File %s cann't open!", outfile);return -1;}//读入已知点的坐标ReadKnwData(in, &pnts);Init(&pnts);//观测值信息写到动态数组ReadObsValue(in, &pnts);//求角度闭合差fbFb(&pnts);//角度改正CorrectAngle(&pnts);//推算方位角Direct(&pnts);。