闭合附和导线近似平差 ∈ 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, 如有发现,请尽快与博主联系!