在测绘的实际操作中,我们会遇到这样的一些闭合导线的计算。闭合导线的计算比较复杂,我们如何利用计算机帮助我们快速地计算,这里我们使用C#编写一个有(好看)界面的导线计算程序

问题

这是我们计算的结果

这是答案的结果

可以看出答案是差不多的,当然存在误差和计算机保存小数的一些问题有关。下面来看一下如何完成这样的一个简单的程序(默认知道闭合导线是怎么计算的)

角度(弧度)的转换的

  1. 这里我们输入是按照“dd ff mm” 的格式输入的,需要通过转换将其转换为小数形式,然后在计算三角函数时要化为弧度
    这里我们用的datagridview控件展示的数据,可以利用split()函数分割里面的单元格得到度分秒,通过这个公式得到角度
angle = D + F / 60 + M / 3600;  // 度分秒转换为度

至于计算时的弧度,高中就知道可以这样完成

radian = angle / 180 * Math.PI;  // 角度转弧度

计算角度的闭合差并分配误差

  1. 一个n边形的内角和是(n-2)*180度,但实际在测量中,肯定得不到准确的这个数据,所以我们需要计算闭合差并将其分配,使内角和等于理论值。这里的允许误差是40√n,n是测站数,分配原则是反向平均分配。这里我肯可以通过角度误差分配来实现
// 角度误差分配private void btnAng_Click(object sender, EventArgs e){double rawang = (num - 2) * 180;  // 理论值double nowang = 0;  // 测量值double exang = 0;  // 分配误差double error = 0;  // 允许闭合差int i;  // 控制变量error = 40 * Math.Sqrt(num) / 3600;  // 计算允许的闭合差try{for (i = 0; i < num; i++){nowang += double.Parse(dgvList.Rows[i].Cells[0].Value.ToString());}exang = nowang - rawang;if (Math.Abs(exang) > error){MessageBox.Show("角度闭合差大于允许闭合差");}else{exang /= (-1) * num;for (i = 0; i < num; i++){dgvList.Rows[i].Cells[0].Value =(Convert.ToDouble(dgvList.Rows[i].Cells[0].Value.ToString()) + exang);}dgvList.Rows[i].Cells[0].Value = "校正";}angle_able = true;}}catch{ }        }

计算坐标方位角

  1. 在得到坐标的增量时,我们需要坐标的方位角和测站的距离,距离已知了,所以这里我们要通过一个方法实现计算坐标的方位角
public double GetAngle(double lastaziang, double turnang, bool RorL){double aziang = 0;//坐标方位角if (RorL == false)//右角公式{aziang = lastaziang + 180 - turnang;//角度}else//左角公式{aziang = lastaziang - 180 + turnang;}while (aziang > 360 || aziang < 0){if (aziang > 360){aziang -= 360;}else if (aziang < 0){aziang += 360;}}return aziang;}

计算坐标的增量

  1. 坐标的增量可以通过dertX = distance * Math.Cos(azirad)dertY = distance * Math.Sin(azirad)求得,这个azirad就是坐标方位角的弧度形式
  2. 这里的写法比较简单,其中是在datagridview的单元格中直接先计算放上去的,后面的改正将会在原来的基础数据上改正
public void GetVariateDistance(DataGridView dgvList, int num){int i;for (i = 0; i < num; i++){dgvList.Rows[i].Cells[4].Value =double.Parse(dgvList.Rows[i].Cells[1].Value.ToString()) * Math.Cos(double.Parse(dgvList.Rows[i].Cells[3].Value.ToString()) / 180 * Math.PI);dgvList.Rows[i].Cells[5].Value =double.Parse(dgvList.Rows[i].Cells[1].Value.ToString()) * Math.Sin(double.Parse(dgvList.Rows[i].Cells[3].Value.ToString()) / 180 * Math.PI);}}

坐标增量的简单平差

  1. 因为这是一个闭合导线,所以理论上坐标增量的和应该为零(又回到最初的起点),然而因为误差的存在并不是这样的,所以我们要把闭合差(√((∑dertX)^ 2)+ (∑dertY)^ 2)))按照边长的比例反其符号分配给每个坐标增量,量距导线和测距导线的闭合差一般都小于1/2000,这里我们可以使用这样处理
public void ExVariateDistance(DataGridView dgvList, int num, double xVariate, double yVariate, double distance){int i = 0;for (i = 0; i < num; i++){xVariate += double.Parse(dgvList.Rows[i].Cells[4].Value.ToString());yVariate += double.Parse(dgvList.Rows[i].Cells[5].Value.ToString());distance += double.Parse(dgvList.Rows[i].Cells[1].Value.ToString());}xVariate /= ((-1) * distance);yVariate /= ((-1) * distance);for (i = 0; i < num; i++){dgvList.Rows[i].Cells[4].Value =(Convert.ToDouble(dgvList.Rows[i].Cells[4].Value.ToString()) + (xVariate * Convert.ToDouble(dgvList.Rows[i].Cells[1].Value.ToString())));dgvList.Rows[i].Cells[5].Value =(Convert.ToDouble(dgvList.Rows[i].Cells[5].Value.ToString()) + (yVariate * Convert.ToDouble(dgvList.Rows[i].Cells[1].Value.ToString())));}dgvList.Rows[i].Cells[4].Value = "校正";dgvList.Rows[i].Cells[5].Value = "校正";}

最后就是求坐标

  1. 这个就是从已知的那个起点坐标开始加坐标增量,得到每一个导线点的坐标,也就是第二个点的X坐标就是X = startX + dertX,Y坐标是Y = startY + dertY。后面的点依次加dert。代码如下,这里使用(x|y)这样的格式显示
public void GetPoint(double BX, double BY, DataGridView dgvList, int num){double X;double Y;try{X = BX + double.Parse(dgvList.Rows[0].Cells[4].Value.ToString());Y = BY + double.Parse(dgvList.Rows[0].Cells[5].Value.ToString());dgvList.Rows[0].Cells[6].Value = "(" + X + "|" + Y + ")";for (int i = 1; i < num; i++){X += double.Parse(dgvList.Rows[i].Cells[4].Value.ToString());Y += double.Parse(dgvList.Rows[i].Cells[5].Value.ToString());dgvList.Rows[i].Cells[6].Value = "(" + X + "|" + Y + ")";}}catch{ }}

做后就完成了,只在豆丁上找了一个题测试了一下(见开头)。完整的代码没有贴出来,界面的设计也没说了,还有一些其他的杂七杂八的功能。这是很早之前写的,中间一些细节现在也忘了,之前的代码写的不好,但能提供一些参考作用,所以还是记录下来

有窗体的闭合导线计算程序(C#)相关推荐

  1. 闭合导线计算软件excel_测量坐标计算程序 V6

    公众号:cehui6  (←长按复制) 主要发布工程测量行业信息,包括:测量文章,坐标软件.计算程序,资源共享等. 程序简介: 测量坐标计算程序是通过Microsoft Office Excel VB ...

  2. VB中窗体模块、标准模块、类模块的区别

    VB的代码存储在模块中.在VB中提供了三种类型的模块:窗体模块.标准模块和类模块. 简单的应用程序可以只有一个窗体,所用的程序都驻留在窗体模块中,而当应用程序庞大复杂时,就要另外附加窗体.最终可能有几 ...

  3. 坐标反算c语言程序,测量坐标计算程序

    测量坐标计算程序适用于公路.铁路等线路坐标计算,程序主要包括(交点法.线元法.直线坐标正反算,竖曲线计算,平面控制网"导线.高程"平差,隧道超欠挖,超高加宽,测量工具箱等,还可以全 ...

  4. McCabe度量法计算程序的环路复杂性

    McCabe度量法计算程序的环路复杂性:

  5. 【VB】学生信息管理系统2——窗体设计

    这次学生系统是照着书敲的,先敲完然后开始调试!中途遇到了很多问题,查了很多,这里不容易系统的总结!所以就针对各个问题,各个击破! 问题一:VB 6.0中,状态栏控件(sbstatusbar):右击选项 ...

  6. 客快物流大数据项目(五十四):初始化Spark流式计算程序

    目录 初始化Spark流式计算程序 一.SparkSql参数调优设置 1.设置会话时区

  7. 无边框窗体和用户控件以及权限

    无边框窗体: 就是吧窗体的边框去掉,然后自己做按钮设置功能. 无边框窗体的移动: 将下面代码直接复制粘贴,将窗体的鼠标按下事件的方法改成下面方法的名字就可以直接使用 1 //窗体移动API 2 [Dl ...

  8. [转][小结][三种方法]实现WPF不规则窗体

    实现WPF不规则窗体的三种常用的方法如下: 1.使用Blend等工具绘制一个不规则xaml,然后作为窗体的背景.这个可以参考xiaowei0705的这篇博文:WPF制作不规则的窗体 . 2.给wind ...

  9. vs2003复制一个web窗体,没有更改指向同一个cs 文件,引发大问题

    今天我在原来的考试系统的出题模块中,input模块,因为增加的一个web窗体编译有问题,于是就复制了原来的启动项页面input,再改了名字为set1,然后在set1页面上删除了控件和代码,再把set1 ...

  10. swing 圆角按钮_JFrame实现圆角窗体

    现在开发一个窗体程序,经常要求用圆角窗体.而在Windows 经典外观下,直接写出来的窗体却是方型的.在windows 7.windows server2008 的外观下,就已经是圆角的了. 这里我们 ...

最新文章

  1. Linux下配置Node.js环境
  2. 201671010139 徐楠
  3. VS VC 读取 INI文件
  4. JDK源码解析之 Java.lang.Float
  5. Qt笔记-QSslSocket双向认证
  6. cmd命令行怎样运行python_在CMD命令行中运行python脚本的方法
  7. 20191021:(leetcode习题)乘积小于K的子数组
  8. 使用Python调用ASA rest API进行配置
  9. docker compose启动服务超时重启记录
  10. CentOS7安装配置svn及svn hook实战
  11. 语音信号处理-概念(二):幅度谱(短时傅里叶变换谱/STFT spectrum)、梅尔谱(Mel spectrum)【语音的深度学习主要用幅度谱、梅尔谱】【用librosa或torchaudio提取】
  12. 使用 .reg 文件操作注册表
  13. 个人博客如何申请ICP备案
  14. 战地2142 我喜欢...
  15. 360安全卫士防黑加固关闭了Telnet远程连接服务,如何开启?
  16. C语言程序设计-五子棋游戏设计系统01
  17. 数据分析师常用的 Linux 命令总结
  18. IIS如何设置默认访问https
  19. 最好的在线SQL优化平台 - PawSQL Cloud来了
  20. Autocad的快捷键

热门文章

  1. MyBatis入门(五)---延时加载、缓存
  2. 咸宁php培训,PHP培训
  3. 有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代
  4. clientHeight、scrollHeight、offsetHeight的区别和理解
  5. python词库介绍_解析搜狗词库(python)
  6. java代码做一个电子表
  7. 查询linux安装了哪种中文,linux 安装 中文字体
  8. 谷粒商城 Day04 sku与spu接口
  9. radius服务器连接无线网络,验证RADIUS服务器连接用测验AAA RADIUS命令
  10. 啦啦外卖独立版42.0至尊版全开源含vue代码修复app没声音