logo资料库

测量程序设计.doc

第1页 / 共61页
第2页 / 共61页
第3页 / 共61页
第4页 / 共61页
第5页 / 共61页
第6页 / 共61页
第7页 / 共61页
第8页 / 共61页
资料共61页,剩余部分请下载后查看
完成的类 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])) &&
分享到:
收藏