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的方位角
根据坐标闭合差,自行定权分配坐标增量;输入改正后的坐标增量检查是否闭合
仅供学习交流使用