闭合附和导线近似平差 ∈ C# 编程笔记

【日志】
2020/6/26
今天想用一下之前写的导线平差计算的小程序代码,打开来一看,
在这里插入图片描述
强迫症令我得又重新搞一遍,好处是可以复习一下,但是真累啊!!
2020/6/27 搞了两天,终于搞完了,我想说,改程序真的不比写程序轻松。在尝试改程序失败后,我霸气地把原程序都删了,重新干,破而后立!

一、原理

我去啊,一时半会还真想不起来,怎么来编程的!还是从一道例题(来源于之前的课件)开始吧!
题目描述如下:
在这里插入图片描述
解答过程如下:
在这里插入图片描述
原理就看这个例子就好了。记住一句话:角均分,坐标按距离分,角限差40根n。闭合可转附和!

二、源码

        /*此函数用近似平差计算导线-通法
         * 输入:dx1 dx2 两个定向角
         *       yz1 yz2 两个已知点
         *       gpt 测站数组
         * 输出:Gpt 得出坐标的测站数组
         */
        public GPoint[] DXJS(Angle dx1, Angle dx2, Point yz1, Point yz2, GPoint[] gpt)
        {
            int n = gpt.Length;
            GPoint[] Gpt = new GPoint[n+1];
            for (int i = 0; i < n+1; i++)
                Gpt[i] = new GPoint();

            Gpt[0].pt = yz1; Gpt[0].s = gpt[0].s;
            Gpt[0].an = Angle.GetNext_FV(dx1, gpt[0].an);
            for (int i = 1; i < n; i++)
            {
                Gpt[i].an = Angle.GetNext_FV(Gpt[i - 1].an, gpt[i].an);
                Gpt[i].s = gpt[i].s;
            }
            Angle ang1 = Gpt[n - 1].an - dx2;

            double dbeta = ang1.rad > (Math.PI * 2 - ang1.rad) ? (Math.PI * 2 - ang1.rad) : ang1.rad,
                dbetan = dbeta / n,
                sSum = 0;
            for (int i = 0; i < n - 1; i++)
            {
                Gpt[i].an = new Angle(Gpt[i].an.rad - dbetan);
                Gpt[i + 1].pt = new Point(Gpt[i].pt, Gpt[i].s, Gpt[i].an);
                sSum += Gpt[i+1].s;
            }
            double dx = Gpt[n - 1].pt.x - yz2.x,
                dy = Gpt[n - 1].pt.y - yz2.y,
                ddx = 0, ddy = 0;
            for (int i = 1; i < n; i++)
            {
                ddx += dx * Gpt[i].s / sSum;
                ddy += dy * Gpt[i].s / sSum;
                Gpt[i].pt.x -= ddx;
                Gpt[i].pt.y -= ddy;
            }
            double fs = Math.Sqrt(dx * dx + dy * dy),
                N = sSum / fs,
                aX = 40 * Math.Sqrt(n - 1);
            dbeta *= 3600 * 180 / Math.PI;
            Gpt[n].s = fs; Gpt[n].pt = new Point(N, aX, dbeta);

            return Gpt;//最后一个点存精度
        }

注意:闭合的 yz1=yz2, dx2=dx1+PI
为了搞好这个,创建了一个新的类:GPoint ,代表测站。测站信息有测站点、观测角(后来变成边的方向角),边长。

    //测站类
    public class GPoint
    {//Define fields
        public Point pt;
        public double s;//观测角(弧度表示),边长
        public Angle an;//观测角

        public Point Pt
        { get { return pt; } set { pt = value; } }
        public Angle An
        { get { return an; } set { an = value; } }
        public double S
        { get { return s; } set { s = value; } }

        //The constructor
        public GPoint(double h = 0, double s = 0, string name = "0", double x = 0, double y = 0, double z = 0)
        {//构造函数1
            this.pt = new Point(x,y,z,name);
            this.an = new Angle(h);
            this.s = s;
        }
        public GPoint(Point pt,Angle an,double s)
        {//构造函数2
            this.pt = pt;
            this.an = an;
            this.s = s;
        }
    }

其所依附的类有:

点类:https://blog.csdn.net/Gou_Hailong/article/details/88989274
角类:https://blog.csdn.net/Gou_Hailong/article/details/95803595

三、秀一波~

在这里插入图片描述

【注1】其中的代码也许并不完整,您可以作为伪码参看,或者您可以去我主博客逛逛,也许有意外之喜!
【注2】此篇博客是 C# 编程笔记 的子博客。
【注3】由于博主水平有限,程序可能存在漏洞或bug, 如有发现,请尽快与博主联系!

  • 13
    点赞
  • 106
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值