完成的类
using System;
using System.Collections.Generic;
using System.Text;
namespace ClassLibrary3
{
public class cejiao_jiao
{
public double cj_j(double jiao)
{
jiao = Math.Abs(jiao);
int du = (int)(Math.Floor(jiao));
jiao = (jiao - du) * 100;
int fen = (int)(Math.Floor(jiao));
jiao = (jiao - fen) * 100;
int miao = (int)(Math.Floor(jiao));
jiao = du + fen / 60 + miao / 3600;
return jiao;
}
}
public class cejiao_jiaomiao
{
public double cj_j(double jiao)
{
jiao = Math.Abs(jiao);
int du = (int)(Math.Floor(jiao));
jiao = (jiao - du) * 100;
int fen = (int)(Math.Floor(jiao));
jiao = (jiao - fen) * 100;
int miao = (int)(Math.Floor(jiao));
jiao = du * 3600 + fen * 60 + miao;
return jiao;
}
}
public class h_j
{
public double HUDU_to_JIAODU(double dd)/////////弧度化测角
{
double a = dd;
a = a * 57.2957795130823;
int d = (int)System.Math.Floor(a);
a = a - d;
a = a * 60;
int f = (int)System.Math.Floor(a);
a = a - f;
a = a * 60;
if (a + 0.0001 > 60) { a = 0; f = f + 1; }
if (f >= 60) { f = 0; d = d + 1; }
a = d + f / 100.0 + a / 10000.0;
return a;
}
}
public class j_h
{
public double JIAO_HUDU(double jiao)/////测角化弧度
{
int d = (int)(Math.Floor(jiao));
jiao = jiao - d;
int f = (int)(Math.Floor(jiao * 100.0));
jiao = jiao * 100 - f;
double m = jiao * 100.0;
jiao = d * 3600.0 + f * 60.0 + m;
double hudu = jiao / 206264.806247096263;
return hudu;
}
}
Arctan的计算
public class fwj
{
public double jisuan(double x1, double y1, double x2, double y2)
{
double cx, cy, cc;
cx = x2 - x1;
cy = y2 - y1;
if (cx == 0 && cy == 0)
return -1;
else
{
if (cx == 0)
{
if (cy > 0)
cc = Math.PI / 2.0;
else
cc = Math.PI * 1.5;
}
else
cc = Math.Atan2(cy, cx);
if (cy < 0 && cx != 0)
cc = cc + Math.PI;
return cc;
}
}
}
高斯投影
public class Gaosi
{
public const double rou = 206264.806247096263;
private double b, c, e, ep, t, l, M, N, g2, CSB, SINB, X;
private double m0, m2, m4, m6, m8, n0, n2, n4, n6, n8, beita0, beita2, beita4, beita6, beita8;
public double zhengsuan(double a, double alf, double B, double L, double L0, out double
y)/////B为弧度,L为秒,L0也为数学上的角度表示
{
//L = L * 3600;///////////
L0 = L0 * 3600;//////////////度化为秒
b = a - a * alf;
e = Math.Sqrt(a * a - b * b) / a;
ep = Math.Sqrt(a * a - b * b) / b;
c = a * a / b;
t = Math.Tan(B);
CSB = Math.Cos(B);
SINB = Math.Sin(B);
g2 = ep * ep * CSB * CSB;
m0 = a * (1 - e * e);
m2 = 3.0 / 2.0 * e * e * m0;
m4 = 5.0 / 4.0 * e * e * m2;
m6 = 7.0 / 6.0 * e * e * m4;
m8 = 9.0 / 8.0 * e * e * m6;
n0 = a;
n2 = 1.0 / 2.0 * e * e * n0;
n4 = 3.0 / 4.0 * e * e * n2;
n6 = 5.0 / 6.0 * e * e * n4;
n8 = 7.0 / 8.0 * e * e * n6;
M = m0 + m2 * SINB * SINB + m4 * SINB * SINB * SINB * SINB + m6 * SINB * SINB * SINB *
SINB * SINB * SINB + m8 * SINB * SINB * SINB * SINB * SINB * SINB * SINB * SINB;
N = n0 + n2 * SINB * SINB + n4 * SINB * SINB * SINB * SINB + n6 * SINB * SINB * SINB *
SINB * SINB * SINB + n8 * SINB * SINB * SINB * SINB * SINB * SINB * SINB * SINB;
l = L - L0;
beita0 = 1.0 - 3.0 / 4.0 * ep * ep + 45.0 / 64.0 * ep * ep * ep * ep - 175.0 / 256.0 *
ep * ep * ep * ep * ep * ep + 11025.0 / 16384.0 * ep * ep * ep * ep * ep * ep * ep * ep;
beita2 = beita0 - 1.0;
beita4 = 15.0 / 32.0 * ep * ep * ep * ep - 175.0 / 384.0 * ep * ep * ep * ep * ep * ep
+ 3675.0 / 8192.0 * ep * ep * ep * ep * ep * ep * ep * ep;
beita6 = -35.0 / 96.0 * ep * ep * ep * ep * ep * ep + 735.0 / 2048.0 * ep * ep * ep *
ep * ep * ep * ep * ep;
beita8 = 315.0 / 1024.0 * ep * ep * ep * ep * ep * ep * ep * ep;
X = c * (beita0 * B + (beita2 * CSB + beita4 * CSB * CSB * CSB + beita6 * CSB * CSB *
CSB * CSB * CSB + beita8 * CSB * CSB * CSB * CSB * CSB * CSB * CSB) * SINB);
double x,y;
x = X + N / 2.0 / rou / rou * SINB * CSB * l * l + N / 24.0 / rou / rou / rou / rou *
SINB * CSB * CSB * CSB * (5.0 - t * t + 9.0 * g2 + 4.0 * g2 * g2) * l * l * l * l + N / 720 / rou
/ rou / rou / rou / rou / rou * SINB * CSB * CSB * CSB * CSB * CSB * (61.0 - 58.0 * t * t + t * t
* t * t) * l * l * l * l * l * l;
y = N / rou * CSB * l + N / (6.0 * rou * rou * rou) * CSB * CSB * CSB * (1.0 - t * t +
g2) * l * l * l + N / (120.0 * rou * rou * rou * rou * rou) * CSB * CSB * CSB * CSB * CSB * (5.0 -
18.0 * t * t + t * t * t * t + 14 * g2 - 58.0 * g2 * t * t) * l * l * l * l * l;
return x;
}
public double daN(double a, double alf, double B)
{
b = a - a * alf;
e = Math.Sqrt(a * a - b * b) / a;
n0 = a;
n2 = 1.0 / 2.0 * e * e * n0;
n4 = 3.0 / 4.0 * e * e * n2;
n6 = 5.0 / 6.0 * e * e * n4;
n8 = 7.0 / 8.0 * e * e * n6;
N = n0 + n2 * SINB * SINB + n4 * SINB * SINB * SINB * SINB + n6 * SINB * SINB * SINB *
SINB * SINB * SINB + n8 * SINB * SINB * SINB * SINB * SINB * SINB * SINB * SINB;
return N;
}
public double gama(double a, double alf,double B, double L, double L0)//,B为弧度L,l0为弧度
{
double tan_gama;
double gama;
b = a - a * alf;
ep = Math.Sqrt(a * a - b * b) / b;
t = Math.Tan(B);
CSB = Math.Cos(B);
SINB = Math.Sin(B);
g2 = ep * ep * CSB * CSB;
l = L - L0;
tan_gama = SINB * l + 1.0 / 3.0 * (1 + t * t + 3 * g2 + 2 * g2 * g2) * SINB * CSB * CSB
* l * l * l + 1.0 / 15.0 * (2 + 4 * t * t + 2 * t * t * t * t) * SINB * CSB * CSB * CSB * CSB * l
* l * l * l * l * l;
gama = Math.Atan(tan_gama);
return gama;
}
}
public class fansuan
{
private double b, c, e, ep, l;
private double B, Bf, Bf1, CSBf, SINBf, Mf, Nf, g2f, tf, fbf;
private double m0, m2, m4, m6, m8, n0, n2, n4, n6, n8, beita0, beita2, beita4, beita6, beita8;
public double fansuan_B(double a, double alf, double L0, double x, double y, out double
L)////////L0用测角表示,算出的B,L为弧度
{
b = a - a * alf;
e = Math.Sqrt(a * a - b * b) / a;
ep = Math.Sqrt(a * a - b * b) / b;
c = a * a / b;
m0 = a * (1 - e * e);
m2 = 3.0 / 2.0 * e * e * m0;
m4 = 5.0 / 4.0 * e * e * m2;
m6 = 7.0 / 6.0 * e * e * m4;
m8 = 9.0 / 8.0 * e * e * m6;
n0 = a;
n2 = 1.0 / 2.0 * e * e * n0;
n4 = 3.0 / 4.0 * e * e * n2;
n6 = 5.0 / 6.0 * e * e * n4;
n8 = 7.0 / 8.0 * e * e * n6;
beita0 = 1.0 - 3.0 / 4.0 * ep * ep + 45.0 / 64.0 * ep * ep * ep * ep - 175.0 / 256.0 *
ep * ep * ep * ep * ep * ep + 11025.0 / 16384.0 * ep * ep * ep * ep * ep * ep * ep * ep;
beita2 = beita0 - 1;
beita4 = 15.0 / 32.0 * ep * ep * ep * ep - 175.0 / 384.0 * ep * ep * ep * ep * ep * ep
+ 3675.0 / 8192.0 * ep * ep * ep * ep * ep * ep * ep * ep;
beita6 = -35.0 / 96.0 * ep * ep * ep * ep * ep * ep + 735 / 2048 * ep * ep * ep * ep *
ep * ep * ep * ep;
beita8 = 315.0 / 1024.0 * ep * ep * ep * ep * ep * ep * ep * ep;
Bf = x / c / beita0;
for (int i = 0; i < 10000; i++)
{
tf = Math.Tan(Bf);
CSBf = Math.Cos(Bf);
SINBf = Math.Sin(Bf);
g2f = ep * ep * CSBf * CSBf;
fbf = c * (beita2 * CSBf + beita4 * CSBf * CSBf * CSBf + beita6 * CSBf * CSBf * CSBf
* CSBf * CSBf + beita8 * CSBf * CSBf * CSBf * CSBf * CSBf * CSBf * CSBf) * SINBf;
Bf1 = (x - fbf) / c / beita0;
if (Math.Abs(Bf - Bf1) < 1e-10)
break;
Bf = Bf1;
}
j_h jhl0 = new j_h();
L0 = jhl0.JIAO_HUDU(L0);
Mf = m0 + m2 * SINBf * SINBf + m4 * SINBf * SINBf * SINBf * SINBf + m6 * SINBf * SINBf
* SINBf * SINBf * SINBf * SINBf + m8 * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf;
Nf = n0 + n2 * SINBf * SINBf + n4 * SINBf * SINBf * SINBf * SINBf + n6 * SINBf * SINBf
* SINBf * SINBf * SINBf * SINBf + n8 * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf * SINBf;
B = Bf - tf * y * y / 2 / Mf / Nf / CSBf + tf / (24 * Mf * Nf * Nf * Nf) * (5 + 3 * tf
* tf + g2f - 9 * g2f * tf * tf) * y * y * y * y - tf / (720 * Mf * Nf * Nf * Nf * Nf * Nf) * (61 +
90 * tf * tf + 45 * tf * tf * tf * tf) * y * y * y * y * y * y;
l = 1 / Nf / CSBf * y - 1 / (6 * Nf * Nf * Nf * CSBf) * (1 + 2 * tf * tf + g2f) * y *
y * y + 1 / (120 * Nf * Nf * Nf * Nf * Nf * CSBf) * (5 + 28 * tf * tf + 24 * tf * tf * tf * tf + 6
* g2f + 8 * g2f * tf * tf) * y * y * y * y * y;
L = l + L0;
return B;
}
}
public class zuobiaoxi
{
private double b, c, e, COSB, COSL, SINL, SINB, N;
double vv, cc, kk, nn;
public void blh_xyz(double a, double alf, double B, double L, double H, out double X, out
double Y, out double Z)//B,L都用测角
{
j_h newjhqiun = new j_h();
B = newjhqiun.JIAO_HUDU(B);//测角化弧度
L = newjhqiun.JIAO_HUDU(L);//测角化弧度
Gaosi qiuN = new Gaosi();
N = qiuN.daN(a, alf, B);//求大N
b = a - a * alf;
e = Math.Sqrt(a * a - b * b) / a;
c = a * a / b;
COSB = Math.Cos(B);
SINB = Math.Sin(B);
SINL = Math.Sin(L);
COSL = Math.Cos(L);
X = (N + H) * COSB * COSL;
Y = (N + H) * COSB * SINL;
vv = (1 - e * e);
cc = N * vv;
Z = ((N * (1.0 - e * e)) + H) * SINB;
nn = Z / SINB;
kk = nn - cc;
}
public void xyz_blh(double a, double alf, out double B, out double L, out double H, double
X, double Y, double Z)//BL为测角
{
}
b = a - a * alf;
e = Math.Sqrt(a * a - b * b) / a;
c = a * a / b;
L = Math.Atan2(Y, X);
B = Math.Atan2(Z, Math.Sqrt(X * X + Y * Y));
SINB = Math.Sin(B);
Gaosi qiuN = new Gaosi();
N = qiuN.daN(a, alf, B);
for (int i = 0; i < 100000; i++)
{
SINB = Math.Sin(B);
b = Math.Atan2(Z + N * e * e * SINB, Math.Sqrt(X * X + Y * Y));
if (Math.Abs(b - B) < 1e-10)
{
break;
}
else B = b;
}
vv = (1 - e * e);
cc = N * vv;
nn = Z / SINB;
kk = nn - cc;
H = kk;
//H = Z / SINB - (N * (1.0 - e * e));
h_j h_j1 = new h_j();
B = h_j1.HUDU_to_JIAODU(B);//弧度化为测角
L = h_j1.HUDU_to_JIAODU(L);
}
public class knownp//.....................................定义已知高程点的类
{
public double[] hight;//已知高程
public string[] knownpName;//已知高程点名
}
public class guancezhi//...............................定义观测值的类
{
public string[] stratp;//测段观测起点
public string[] endp;//测段观测终点
public double[] gaochao;//高差
public double[] ceju;//测距
}
public class jin_si_gao//.............................计算近似高程类
{
string[] unknownpName;
double[] jinsigaocheng;
public void jisuan(int knownpNO, int unknownpNO, string[] knownpNAME, double[] knownpHight,
string[] startp, string[] endp, double[] gaocha, out string[] unknownpName_out, out double[]
jinsigaocheng_out, int hangNO)
//////////////////...已知点个数,.....未知点个数..........已知点名...........已知高
程..............起点名。。。。。终点名。。。。。高差。。。。。。。。。未知点名。。。。。。。。。
近似高程.................观测行数
{
unknownpName = new string[unknownpNO];
jinsigaocheng = new double[unknownpNO];
unknownpName_out = new string[unknownpNO];
jinsigaocheng_out = new double[unknownpNO];
for (int i = 0; i < unknownpNO; i++)
{
jinsigaocheng[i] = new double();
jinsigaocheng_out[i] = new double();
//unknownpName[i] = new string();
//unknownpName_out[i] = new string();/////...........string型的数组不用实例
化???????
}
jinsigaocheng[i] = -10000;
for (int k = 0; k < unknownpNO; k++)//用来是遍历未知点 k
{
for (int i = 0; i < hangNO; i++)//最外循环,遍历所用观测值 i
{
if ((((System.Collections.IList)knownpNAME).Contains(startp[i])) &&
(!(((System.Collections.IList)unknownpName).Contains(endp[i]))))//起点是已知点,终点不是算出来的
未知点,(起点已知,那终点肯定未知)
{
unknownpName[k] = endp[i];//终点名给算出来的未知点
for (int m = 0; m < knownpNO; m++)//循环找已知点
{
if (startp[i] == knownpNAME[m])//如果已知点名和第i行起点相等
{
jinsigaocheng[k] = new double();//实例化
jinsigaocheng[k] = knownpHight[m] + gaocha[i];
goto next_unknownp;
}
}
}
else if ((((System.Collections.IList)unknownpName).Contains(startp[i])) &&
(!(((System.Collections.IList)unknownpName).Contains(endp[i]))) &&
(!(((System.Collections.IList)knownpNAME).Contains(endp[i]))))//``起点算出来的未知点,终点不是已
知点也不是算出来的未知点
unknownpName[k] = endp[i];
for (int m = 0; m < unknownpNO; m++)
{
if (startp[i] == unknownpName[m])
{
jinsigaocheng[k] = new double();
int qianmian;
int doumian;
qianmian = (int)(jinsigaocheng[m]*1000);
doumian = (int )(gaocha[i]*1000);
qianmian = qianmian + doumian;
jinsigaocheng[k] = qianmian / 1000.0;
//jinsigaocheng[k] = jinsigaocheng[m] + gaocha[i];
goto next_unknownp;
}
}
{
}
else if ((((System.Collections.IList)knownpNAME).Contains(endp[i])) &&
(!(((System.Collections.IList)unknownpName).Contains(startp[i]))))//终点是已知点,起点不是算出来
的未知点(起点不可能也是已知点)
{
}
unknownpName[k] = startp[i];
for (int m = 0; m < knownpNO; m++)
{
if (endp[i] == knownpNAME[m])
{
jinsigaocheng[k] = new double();
double qianmian;
double doumian;
qianmian = knownpHight[m];
doumian = gaocha[i];
qianmian = qianmian - doumian;
jinsigaocheng[k] = knownpHight[m] - gaocha[i];
goto next_unknownp;
}
}
else if ((((System.Collections.IList)unknownpName).Contains(endp[i])) &&