本文主要是介绍闭合导线平差计算,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
C语言半自动版本
算法
③坐标增量计算及坐标闭合差计算
代码
#include <stdio.h>
#include <stdlib.h>
#include<math.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop *///转换角度 ,单位秒
double tsa(double a,double b,double c){return a*3600+b*60+c;}
//转换角度,单位度
double tsan(double a,double b,double c){return a+b/60+c/3600;}
//positive number
int *pn(int fw[20][3],int i){int a,b,c,sum,y,j;for(j=0;j<i;j++){sum=fw[j][0]*3600+fw[j][1]*60+fw[j][2];if(fw[j][0]<0){y=(-sum)/360/3600;sum=sum+(y+1)*360*3600; }fw[j][0]=sum/3600,sum=sum%3600;fw[j][1]=sum/60,sum=sum%60;fw[j][2]=sum;}} int ji(int jiao[20][3],int i ,double s[20])
{double sumjiao=0;int j;for(j=0;j<i;j++){sumjiao+=tsa(jiao[j][0],jiao[j][1],jiao[j][2]);}int f=sumjiao-(i-2)*3600*180;printf("f为%d秒,请根据f重新输入平差后角度的 度 分 秒 \n",f); for(j=0;j<i;j++) scanf("%d %d %d",&jiao[j][0],&jiao[j][1],&jiao[j][2]);double a12[3] ;printf("-------------------- \n");printf("请输入边12的方位角的度分秒: \n");scanf("%d %d %d",&a12[0],&a12[1],&a12[2]);int fw[20][3];fw[0][0]=a12[0]-180+jiao[0][0],fw[0][1]=jiao[0][1]+a12[1],fw[0][2]=jiao[0][2]+a12[2];//初始化边23的方位角 for(j=1;j<i;j++) {fw[j][0]=fw[j-1][0]-180+jiao[j][0],fw[j][1]=jiao[j][1]+fw[j-1][1],fw[j][2]=jiao[j][2]+fw[j-1][2];}//储存方位角 double fx=0,fy=0,sx[20],sy[20];//保证角度格式 for(j=0;j<i;j++) {if(fw[j][2]>=60) fw[j][1]+=fw[j][2]/60,fw[j][2]%=60;if(fw[j][1]>=60) fw[j][0]+=fw[j][1]/60,fw[j][1]%=60;}pn(fw,i);for(j=0;j<i;j++) printf("修正后方位角分别为%d度 %d分 %d秒\n",fw[j][0],fw[j][1],fw[j][2]);printf("-------------------- \n");double fwj[20];for(j=0;j<i;j++) fwj[j]=fw[j][0]+(double)(fw[j][1]*60+fw[j][2])/3600,printf("方位角为%lf\n",fwj[j]);//转换角度,单位度 printf("-------------------- \n"); for(j=0;j<i;j++) {sx[j]=s[j]*cos(fwj[j]/180*acos(-1));fx+=sx[j];sy[j]=s[j]*sin(fwj[j]/180*acos(-1));fy+=sy[j];printf("%lf 路段坐标增量为x:%.3lfm,y:%.3lfm \n",s[j],sx[j],sy[j]);}printf("-------------------- \n"); printf("x轴坐标闭合差为:%lfmm \n y轴坐标闭合差为:%lfmm \n",fx*1000,fy*1000);return 0;
}int main(int argc, char *argv[]) {
int i,j,m,jiao[20][3];//数组存储角度初始测量值
double xy[2][2],k=0,s[20],xzy[10][2];
printf("请依次输入已知点2点的x,y坐标:");
for(i=0;i<2;i++){scanf("%lf",&xy[0][0],&xy[0][1]);}double a12=0;
printf("-------------------- \n");
printf("请输入闭合圈所测角,最后一个内角后加以-2结束 \n"); i=0;while(k!=-2){for(m=0;m<3;m++){scanf("%d",&jiao[i][m]);if(jiao[i][m]==-2){printf("请输入闭合圈各路段路程单位m\n"); for(j=0;j<i;j++){scanf("%lf",&s[j]);
}goto tiao;}}
i++;}
tiao: ji(jiao,i,s);//函数传址和值printf("-------------------- \n");
printf("重新输入依比例修正后的坐标增量先x后y单位m\n");
for(j=0;j<i;j++){for(m=0;m<2;m++){scanf("%lf",&xzy[j][m]);}
}
printf("-------------------- \n");
xy[1][0]=xy[0][0],xy[1][1]=xy[0][1];
for(j=0;j<i;j++){xy[1][0]+=xzy[j][0];xy[1][1]+=xzy[j][1];if(j=i-1){printf("第%d点坐标为(%.3lfm,%.3lfm)\n",2,xy[1][0],xy[1][1]);if(xy[1][0]==xy[0][0]&&xy[1][1]==xy[0][1]) printf("恭喜坐标闭合");else printf("坐标不闭合");break;}printf("第%d点坐标为(%.3lfm,%.3lfm)\n",j+3,xy[1][0],xy[1][1]);
}return 0;}
示例运行
1,2为已知点,闭合导线共10个测量内角和10条测量边;(角度上限为20个,可自行修改数组维度)
从2角开始逆时针旋转各角分别为(度 分 秒)
90 37 1
227 25 3
132 17 3
89 22 7
179 27 18
91 3 44
179 43 24
87 31 3
94 13 50
268 19 27
从边2,3开始逆时针各边分别为(m)
258.1179
64.5434
126.383
199.0413
166.7015
278.636
198.1801
110.3129
50.0156
202.9068
运行步骤:
此处为了运行方便调整角度闭合差为0,若不为0,自行分配角度闭合差后输入平差后的角度值
自行计算已知边1,2的方位角
根据坐标闭合差,自行定权分配坐标增量;输入改正后的坐标增量检查是否闭合
仅供学习交流使用
这篇关于闭合导线平差计算的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!