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

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

一、原理

我去啊,一时半会还真想不起来,怎么来编程的!还是从一道例题(来源于之前的课件)开始吧!
题目描述如下:
闭合附和导线近似平差 ∈ C# 编程笔记_第2张图片
解答过程如下:
闭合附和导线近似平差 ∈ C# 编程笔记_第3张图片
原理就看这个例子就好了。记住一句话:角均分,坐标按距离分,角限差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

三、秀一波~

闭合附和导线近似平差 ∈ C# 编程笔记_第4张图片

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

你可能感兴趣的:(测绘,C#)