/// <summary>
            /// 高斯引数法反算
            /// </summary>
            /// <param name="ge">已知元素</param>
            public void GaussInverse(GeodeticElement ge)
            {
                double Bm      = Methods.Average(ge.Br1, ge.Br2),
                       delta_B = ge.Br2 - ge.Br1,
                       delta_L = ge.Lr2 - ge.Lr1,
                       Vm      = Auxiliary.GetV(ep.data.e2_2, Bm),
                       Nm      = Auxiliary.GetN(ep.data.a, ep.data.e_2, Bm),
                       tm      = Auxiliary.Get_t(Bm),
                       tm2     = tm * tm,
                       yita_2  = Auxiliary.GetYita2(ep.data.e2_2, Bm),
                       cos_Bm  = Math.Cos(Bm),
                       cos_Bm2 = cos_Bm * cos_Bm;

                double r01 = Nm * cos_Bm,
                       r21 = r01 / 24 / Math.Pow(Vm, 4) * (1 + yita_2 - 9 * yita_2 * tm2 + yita_2 * yita_2),
                       r03 = -r01 / 24 * cos_Bm2 * tm2;

                double s10 = Nm / Vm / Vm,
                       s12 = -s10 * cos_Bm2 / 24 * (2 + 3 * tm2 + 2 * yita_2 * tm2),
                       s30 = Nm / Math.Pow(Vm, 6) / 8 * (yita_2 - tm2 * yita_2 + yita_2 * yita_2);

                double t01 = tm * cos_Bm,
                       t21 = t01 / 24 / Math.Pow(Vm, 4) * (2 + 7 * yita_2 + 9 * tm2 * yita_2 + 5 * yita_2 * yita_2),
                       t03 = t01 * cos_Bm2 / 24 * (2 + tm2 + 2 * yita_2);

                double S_sinAm = r01 * delta_L + r21 * delta_B * delta_B * delta_L + r03 * Math.Pow(delta_L, 3),
                       S_cosAm = s10 * delta_B + s12 * delta_B * delta_L * delta_L + s30 * Math.Pow(delta_B, 3),
                       delta_A = t01 * delta_L + t21 * delta_B * delta_B * delta_L + t03 * Math.Pow(delta_L, 3);
                //S_sinAm1=S_sinAm,S_cosAm1=S_cosAm,delta_A1=delta_A;

                double Am = _2D_Point.Get_PAngle(new _2D_Point(0, 0), new _2D_Point(S_cosAm, S_sinAm)).ChangeToRad();

                //Am1

                //do
                //{
                //    S_sinAm = S_sinAm1;
                //    S_cosAm = S_cosAm1;
                //    Am = Am1;

                //    S_sinAm1 = delta_L * Nm * cos_Bm - S_sinAm / 24 / Nm / Nm * (S_sinAm * S_sinAm * tm2 - S_cosAm * S_cosAm * (1 + yita_2 - 9 * yita_2 * tm2 + yita_2 * yita_2));
                //    S_cosAm1 = delta_B * Nm / Vm / Vm - S_cosAm1 / 24 / Nm / Nm * (S_sinAm1 * S_sinAm1 * (2 + 3 * tm2 + 2 * yita_2 * tm2) + 3 * yita_2 * S_cosAm * S_cosAm1 * (1 + yita_2 - tm2 + 4 * tm2 * yita_2));
                //    Am1 = _2D_Point.Get_PAngle(new _2D_Point(0, 0), new _2D_Point(S_cosAm1, S_sinAm1)).ChangeToRad();
                //} while (Math.Abs(Angle.ChangeToAngle(Am1 - Am).Miao) > 0.0001);

                ge.S    = ge.Sr = S_sinAm / Math.Sin(Am);
                ge.Ar12 = Am - delta_A / 2;
                ge.A12  = Angle.ChangeToAngle(ge.Ar12);
                if (Am + delta_A >= Math.PI)
                {
                    ge.Ar21 = Am + delta_A / 2 - Math.PI;
                }
                else
                {
                    ge.Ar21 = Am + delta_A / 2 + Math.PI;
                }
                ge.A21 = Angle.ChangeToAngle(ge.Ar21);
            }
            /// <summary>
            /// 贝塞尔正算
            /// </summary>
            /// <param name="ge">已知元素</param>
            public void BesselPositive(GeodeticElement ge)
            {
                double W1     = Auxiliary.GetW(ep.data.e_2, ge.Br1),
                       sin_u1 = Math.Sin(ge.Br1) * Math.Sqrt(1 - ep.data.e_2) / W1,
                       cos_u1 = Math.Cos(ge.Br1) / W1,
                       sinA1  = Math.Sin(ge.Ar12),
                       cosA1  = Math.Cos(ge.Ar12);

                double sinA0        = cos_u1 * sinA1,
                       cot_xigema1  = cos_u1 * cosA1 / sin_u1,
                       sin_2xigema1 = 2 * cot_xigema1 / (cot_xigema1 * cot_xigema1 + 1),
                       cos_2xigema1 = (cot_xigema1 * cot_xigema1 - 1) / (cot_xigema1 * cot_xigema1 + 1);

                double cos2A0 = 1 - sinA0 * sinA0,
                       k_2    = ep.data.e2_2 * cos2A0,
                       k_4    = k_2 * k_2,
                       k_6    = k_2 * k_4,
                       b      = ep.data.b,
                       e_2    = ep.data.e_2,
                       e_4    = e_2 * e_2,
                       e_6    = e_2 * e_4,
                       A      = b * (1 + k_2 / 4 - 3 * k_4 / 64 + 5 * k_6 / 256),
                       B      = b * (k_2 / 8 - k_4 / 32 + 15 * k_6 / 1024),
                       C      = b * (k_4 / 128 - 3 * k_6 / 512),
                       Alph   = e_2 / 2 + e_4 / 8 + e_6 / 8 - (e_4 / 16 + e_6 / 16) * cos2A0 + 3 * e_6 / 128 * cos2A0 * cos2A0,
                       Beta   = (e_4 / 32 + e_6 / 32) * cos2A0 - e_6 / 64 * cos2A0 * cos2A0;

                double xigema0       = (ge.Sr - (B + C * cos_2xigema1) * sin_2xigema1) / A,
                       cos_2xigema0  = Math.Cos(2 * xigema0),
                       sin_2xigema0  = Math.Sin(2 * xigema0),
                       sin_2xigema10 = sin_2xigema1 * cos_2xigema0 + cos_2xigema1 * sin_2xigema0,
                       cos_2xigema10 = cos_2xigema1 * cos_2xigema0 - sin_2xigema0 * sin_2xigema1,
                       xigema        = xigema0 + (B + 5 * C * cos_2xigema10) * sin_2xigema10 / A;

                double delta = (Alph * xigema + Beta * (sin_2xigema1 * Math.Cos(2 * xigema) + cos_2xigema1 * Math.Sin(2 * xigema) - sin_2xigema1)) * sinA0;

                double sin_u2 = sin_u1 * Math.Cos(xigema) + cos_u1 * cosA1 * Math.Sin(xigema),
                       B2     = Math.Atan(sin_u2 / Math.Sqrt((1 - e_2) * (1 - sin_u2 * sin_u2))),
                       lamda  = Math.Atan2(sinA1, (cos_u1 * Math.Cos(xigema) - sin_u1 * Math.Sin(xigema) * cosA1) / Math.Sin(xigema)),
                       L2     = ge.Lr1 + lamda - delta;
                var A2        = _2D_Point.Get_PAngle(new _2D_Point(0, 0),
                                                     new _2D_Point(-(Math.Cos(xigema) * cos_u1 * cosA1 - sin_u1 * Math.Sin(xigema)) / cos_u1, -sinA1));

                ge.Br2  = B2; ge.Lr2 = L2;
                ge.B2   = Angle.ChangeToAngle(B2); ge.L2 = Angle.ChangeToAngle(L2);
                ge.Ar21 = A2.ChangeToRad(); ge.A21 = A2;
            }
示例#3
0
            /// <summary>
            /// 贝塞尔反算1
            /// </summary>
            /// <param name="ge"></param>
            public void BesselInverse1(GeodeticElement ge)
            {
                double W1 = Auxiliary.GetW(ep.data.e_2, ge.Br1),
                       W2 = Auxiliary.GetW(ep.data.e_2, ge.Br2),
                       sin_u1 = Math.Sin(ge.Br1) * Math.Sqrt(1 - ep.data.e_2) / W1,
                       sin_u2 = Math.Sin(ge.Br2) * Math.Sqrt(1 - ep.data.e_2) / W2,
                       cos_u1 = Math.Cos(ge.Br1) / W1,
                       cos_u2 = Math.Cos(ge.Br2) / W2,
                       L = ge.Lr2 - ge.Lr1,
                       a1 = sin_u1 * sin_u2,
                       a2 = cos_u1 * cos_u2,
                       b1 = cos_u1 * sin_u2,
                       b2 = sin_u1 * cos_u2,
                       delta0=0,
                       delta1=delta0,
                       lamda,
                       A1,
                       xigema,xigema1,xigema2,
                       sin_xigema,
                       cos_xigema,
                       sinA0,
                       cos2A0;
                do
                {
                    delta0 = delta1;
                    lamda = L + delta0;

                    double sinlamda = Math.Sin(lamda),
                            coslamda = Math.Cos(lamda);

                    double p = cos_u2 * sinlamda,
                            q = b1 - b2 * coslamda;

                    A1 = _2D_Point.Get_PAngle(_2D_Point.Origin, new _2D_Point(q, p)).ChangeToRad();

                    sin_xigema = p * Math.Sin(A1) + q * Math.Cos(A1);
                    cos_xigema = a1 + a2 * Math.Cos(lamda);
                    xigema = Math.Atan(sin_xigema / cos_xigema);
                    if (cos_xigema < 0) xigema = Math.PI - Math.Abs(xigema);
                    else xigema = Math.Abs(xigema);
                    sinA0 = cos_u1 * Math.Sin(A1);

                    double sinA1 = Math.Sin(A1),
                           cosA1 = Math.Cos(A1),
                           tan_xigema1 = sin_u1 / cos_u1 / cosA1;
                    xigema1 = Math.Atan(tan_xigema1);
                    xigema2 = xigema + xigema1;

                    cos2A0 = 1 - sinA0 * sinA0;
                    double e_2 = ep.data.e_2,
                            e_4 = e_2 * e_2,
                            e_6 = e_2 * e_4,
                            Alph = e_2 / 2 + e_4 / 8 + e_6 / 8 - (e_4 / 16 + e_6 / 16) * cos2A0 + 3 * e_6 / 128 * cos2A0 * cos2A0,
                            Beta = (e_4 / 32 + e_6 / 32) * cos2A0 - e_6 / 64 * cos2A0 * cos2A0,
                            Beta1 = 2 * Beta / cos2A0;
                    delta1 = sinA0 * (Alph * xigema + Beta * (Math.Sin(2 * xigema2) - Math.Sin(2 * xigema1)));

                } while (Math.Abs(delta0 - delta1) * Methods.ρ > 0.0001);

                double k_2 = ep.data.e2_2 * cos2A0,
                       k_4 = k_2 * k_2,
                       k_6 = k_2 * k_4,
                       b = ep.data.b,
                       A = b * (1 + k_2 / 4 - 3 * k_4 / 64 + 5 * k_6 / 256),
                       B = b * (k_2 / 8 - k_4 / 32 + 15 * k_6 / 1024),
                       C = b * (k_4 / 128 - 3 * k_6 / 512),
                       B_pp = 2 * B / cos2A0,
                       C_pp = 2 * C / cos2A0 / cos2A0;

                double S = A * xigema + (B+C*Math.Cos(2*xigema1)) * Math.Sin(2*xigema1)-Math.Sin(2*xigema2)*(B+C*Math.Cos(2*xigema2)),
                       p1 = cos_u1 * Math.Sin(lamda),
                       q1 = b1 * Math.Cos(lamda) - b2;
                var A21 = _2D_Point.Get_PAngle(_2D_Point.Origin, new _2D_Point(-q1, -p1));

                ge.S = ge.Sr = S;
                ge.A21 = A21; ge.Ar21 = A21.ChangeToRad();
                ge.Ar12 = A1; ge.A12 = Angle.ChangeToAngle(A1);
            }
示例#4
0
            /// <summary>
            /// 高斯引数法反算
            /// </summary>
            /// <param name="ge">已知元素</param>
            public void GaussInverse(GeodeticElement ge)
            {
                double Bm = Methods.Average(ge.Br1, ge.Br2),
                       delta_B = ge.Br2 - ge.Br1,
                       delta_L = ge.Lr2 - ge.Lr1,
                       Vm = Auxiliary.GetV(ep.data.e2_2, Bm),
                       Nm = Auxiliary.GetN(ep.data.a, ep.data.e_2, Bm),
                       tm = Auxiliary.Get_t(Bm),
                       tm2=tm*tm,
                       yita_2 = Auxiliary.GetYita2(ep.data.e2_2, Bm),
                       cos_Bm=Math.Cos(Bm),
                       cos_Bm2=cos_Bm*cos_Bm;

                double r01 = Nm * cos_Bm,
                       r21 = r01 / 24 / Math.Pow(Vm, 4) * (1 + yita_2 - 9 * yita_2 * tm2 + yita_2 * yita_2),
                       r03 = -r01 / 24 * cos_Bm2 * tm2;

                double s10 = Nm / Vm / Vm,
                       s12 = -s10 * cos_Bm2 / 24 * (2 + 3 * tm2 + 2 * yita_2*tm2),
                       s30 = Nm /Math.Pow(Vm,6)/ 8 * (yita_2- tm2 * yita_2+yita_2*yita_2);

                double t01 = tm * cos_Bm,
                       t21 = t01 / 24 / Math.Pow(Vm, 4) * (2 + 7 * yita_2 +9*tm2*yita_2 + 5 * yita_2 * yita_2),
                       t03 = t01 * cos_Bm2 / 24 * (2+tm2 +2* yita_2);

                double S_sinAm = r01 * delta_L + r21 * delta_B * delta_B * delta_L + r03 * Math.Pow(delta_L, 3),
                       S_cosAm = s10 * delta_B + s12 * delta_B * delta_L * delta_L + s30 * Math.Pow(delta_B, 3),
                       delta_A = t01 * delta_L + t21 * delta_B * delta_B * delta_L + t03 * Math.Pow(delta_L, 3);
                       //S_sinAm1=S_sinAm,S_cosAm1=S_cosAm,delta_A1=delta_A;

                double Am = _2D_Point.Get_PAngle(new _2D_Point(0, 0), new _2D_Point(S_cosAm, S_sinAm)).ChangeToRad();
                       //Am1

                //do
                //{
                //    S_sinAm = S_sinAm1;
                //    S_cosAm = S_cosAm1;
                //    Am = Am1;

                //    S_sinAm1 = delta_L * Nm * cos_Bm - S_sinAm / 24 / Nm / Nm * (S_sinAm * S_sinAm * tm2 - S_cosAm * S_cosAm * (1 + yita_2 - 9 * yita_2 * tm2 + yita_2 * yita_2));
                //    S_cosAm1 = delta_B * Nm / Vm / Vm - S_cosAm1 / 24 / Nm / Nm * (S_sinAm1 * S_sinAm1 * (2 + 3 * tm2 + 2 * yita_2 * tm2) + 3 * yita_2 * S_cosAm * S_cosAm1 * (1 + yita_2 - tm2 + 4 * tm2 * yita_2));
                //    Am1 = _2D_Point.Get_PAngle(new _2D_Point(0, 0), new _2D_Point(S_cosAm1, S_sinAm1)).ChangeToRad();
                //} while (Math.Abs(Angle.ChangeToAngle(Am1 - Am).Miao) > 0.0001);

                ge.S = ge.Sr = S_sinAm / Math.Sin(Am);
                ge.Ar12 = Am - delta_A / 2;
                ge.A12 = Angle.ChangeToAngle(ge.Ar12);
                if (Am + delta_A >= Math.PI)
                {
                    ge.Ar21 = Am + delta_A/2 - Math.PI;
                }
                else
                    ge.Ar21 = Am + delta_A/2 + Math.PI;
                ge.A21 = Angle.ChangeToAngle(ge.Ar21);
            }
示例#5
0
            /// <summary>
            /// 贝塞尔正算
            /// </summary>
            /// <param name="ge">已知元素</param>
            public void BesselPositive(GeodeticElement ge)
            {
                double W1 = Auxiliary.GetW(ep.data.e_2, ge.Br1),
                       sin_u1 = Math.Sin(ge.Br1) * Math.Sqrt(1 - ep.data.e_2) / W1,
                       cos_u1 = Math.Cos(ge.Br1) / W1,
                       sinA1=Math.Sin(ge.Ar12),
                       cosA1=Math.Cos(ge.Ar12);

                double sinA0 = cos_u1 * sinA1,
                       cot_xigema1 = cos_u1 * cosA1 / sin_u1,
                       sin_2xigema1 = 2 * cot_xigema1 / (cot_xigema1 * cot_xigema1 + 1),
                       cos_2xigema1 = (cot_xigema1 * cot_xigema1 - 1) / (cot_xigema1 * cot_xigema1 + 1);

                double cos2A0 = 1 - sinA0 * sinA0,
                       k_2 = ep.data.e2_2 * cos2A0,
                       k_4 = k_2 * k_2,
                       k_6 = k_2 * k_4,
                       b = ep.data.b,
                       e_2 = ep.data.e_2,
                       e_4 = e_2 * e_2,
                       e_6 = e_2 * e_4,
                       A = b * (1 + k_2 / 4 - 3 * k_4 / 64 + 5 * k_6 / 256),
                       B = b * (k_2 / 8 - k_4 / 32 + 15 * k_6 / 1024),
                       C = b * (k_4 / 128 - 3 * k_6 / 512),
                       Alph = e_2 / 2 + e_4 / 8 + e_6 / 8 - (e_4 / 16 + e_6 / 16) * cos2A0 + 3 * e_6 / 128 * cos2A0 * cos2A0,
                       Beta = (e_4 / 32 + e_6 / 32) * cos2A0 - e_6 / 64 * cos2A0 * cos2A0;

                double xigema0 = (ge.Sr - (B + C * cos_2xigema1) * sin_2xigema1) / A,
                       cos_2xigema0 = Math.Cos(2 * xigema0),
                       sin_2xigema0 = Math.Sin(2 * xigema0),
                       sin_2xigema10 = sin_2xigema1 * cos_2xigema0 + cos_2xigema1 * sin_2xigema0,
                       cos_2xigema10 = cos_2xigema1 * cos_2xigema0 - sin_2xigema0 * sin_2xigema1,
                       xigema = xigema0 + (B + 5 * C * cos_2xigema10) * sin_2xigema10 / A;

                double delta = (Alph * xigema + Beta * (sin_2xigema1 * Math.Cos(2 * xigema) + cos_2xigema1 * Math.Sin(2 * xigema) - sin_2xigema1)) * sinA0;

                double sin_u2 = sin_u1 * Math.Cos(xigema) + cos_u1 * cosA1 * Math.Sin(xigema),
                       B2 = Math.Atan(sin_u2 / Math.Sqrt((1 - e_2) * (1 - sin_u2 * sin_u2))),
                       lamda = Math.Atan2(sinA1, (cos_u1 * Math.Cos(xigema) - sin_u1 * Math.Sin(xigema) * cosA1) / Math.Sin(xigema)),
                       L2 = ge.Lr1 + lamda - delta;
                var A2 = _2D_Point.Get_PAngle(new _2D_Point(0, 0),
                   new _2D_Point(-(Math.Cos(xigema) * cos_u1 * cosA1 - sin_u1 * Math.Sin(xigema)) / cos_u1, -sinA1));

                ge.Br2 = B2; ge.Lr2 = L2;
                ge.B2 = Angle.ChangeToAngle(B2); ge.L2 = Angle.ChangeToAngle(L2);
                ge.Ar21 = A2.ChangeToRad(); ge.A21 =A2 ;
            }
示例#6
0
            ///// <summary>
            ///// 构造函数,自定义椭球
            ///// </summary>
            ///// <param name="a">椭球元素a</param>
            ///// <param name="b">椭球元素b</param>
            //public GeodeticSolution(double a, double b)
            //{
            //    ep = new Ellipsoid(a, b);
            //}
            /// <summary>
            /// 高斯平均引数法正算
            /// </summary>
            /// <param name="ge">已知条件</param>
            public void GaussPositive(GeodeticElement ge)
            {
                double e2_2 = ep.data.e2_2,
                      c = ep.data.c,
                      Vm = Auxiliary.GetV(e2_2, ge.Br1),
                      Mm = c / Vm / Vm / Vm,
                      Nm = c / Vm,
                      delta_B0 = Methods.ρ / Mm * ge.Sr * Math.Cos(ge.Ar12),
                      delta_L0 = Methods.ρ / Nm * ge.Sr * Math.Sin(ge.Ar12) / Math.Cos(ge.Br1),
                      delta_A0 = delta_L0 * Math.Sin(ge.Br1),
                      delta_B1=delta_B0,
                      delta_L1=delta_L0,
                      delta_A1=delta_A0,
                      Bm,
                      Am,
                      tm,
                      yita_2;
                   #region 迭代法求解
                   do
                   {
                   delta_B0=delta_B1;
                   delta_L0=delta_L1;
                   delta_A0=delta_A1;
                   Bm=ge.Br1+delta_B0/2/Methods.ρ;
                   Am=ge.Ar12+delta_A0/2/Methods.ρ;
                   Vm = Auxiliary.GetV(e2_2, Bm);
                   Nm = c / Vm;
                   tm=Auxiliary.Get_t(Bm);
                   yita_2=Auxiliary.GetYita2(e2_2,Bm);

                   delta_B1 = Vm * Vm / Nm * Methods.ρ * ge.Sr * Math.Cos(Am) *
                           (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                              (Math.Sin(Am) * Math.Sin(Am) * (2 + 3 * tm * tm + 3 * yita_2*tm*tm) +
                                3 * yita_2 * Math.Cos(Am) * Math.Cos(Am) * (-1 +tm*tm- yita_2 - 4 * yita_2 * tm * tm)));

                   delta_L1 = Methods.ρ / Nm * ge.Sr * Math.Sin(Am) /Math.Cos(Bm)*
                           (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                              (Math.Sin(Am) * Math.Sin(Am)  * tm * tm -
                                 Math.Cos(Am) * Math.Cos(Am) * (1 + yita_2 - 9 * yita_2 * tm * tm+yita_2*yita_2)));

                   delta_A1 = Methods.ρ / Nm * ge.Sr * Math.Sin(Am) *tm*
                           (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                              (Math.Cos(Am) * Math.Cos(Am) * (2 + 7*yita_2 + 9 * yita_2 * tm * tm+5*yita_2*yita_2) +
                                 Math.Sin(Am) * Math.Sin(Am) * (2 + tm*tm + 2 * yita_2)));

                   }while(Math.Abs(delta_B1-delta_B0)>0.0001||
                      Math.Abs(delta_L1-delta_L0)>0.0001||
                      Math.Abs(delta_A1-delta_A0)>0.0001);
                   #endregion

                   ge.Br2 = ge.Br1 + delta_B1 / Methods.ρ;
                   ge.B2 = Angle.ChangeToAngle(ge.Br2);
                   ge.Lr2 = ge.Lr1 + delta_L1 / Methods.ρ;
                   ge.L2 = Angle.ChangeToAngle(ge.Lr2);
                   if(ge.Ar12+delta_A1/Methods.ρ>=Math.PI)
                   {
                   ge.Ar21 = ge.Ar12 + delta_A1 / Methods.ρ - Math.PI;
                   }
                else
                   ge.Ar21 = ge.Ar12 + delta_A1 / Methods.ρ + Math.PI;
                   ge.A21 = Angle.ChangeToAngle(ge.Ar21);
            }
            /// <summary>
            /// 贝塞尔反算1
            /// </summary>
            /// <param name="ge"></param>
            public void BesselInverse1(GeodeticElement ge)
            {
                double W1     = Auxiliary.GetW(ep.data.e_2, ge.Br1),
                       W2     = Auxiliary.GetW(ep.data.e_2, ge.Br2),
                       sin_u1 = Math.Sin(ge.Br1) * Math.Sqrt(1 - ep.data.e_2) / W1,
                       sin_u2 = Math.Sin(ge.Br2) * Math.Sqrt(1 - ep.data.e_2) / W2,
                       cos_u1 = Math.Cos(ge.Br1) / W1,
                       cos_u2 = Math.Cos(ge.Br2) / W2,
                       L      = ge.Lr2 - ge.Lr1,
                       a1     = sin_u1 * sin_u2,
                       a2     = cos_u1 * cos_u2,
                       b1     = cos_u1 * sin_u2,
                       b2     = sin_u1 * cos_u2,
                       delta0 = 0,
                       delta1 = delta0,
                       lamda,
                       A1,
                       xigema, xigema1, xigema2,
                       sin_xigema,
                       cos_xigema,
                       sinA0,
                       cos2A0;

                do
                {
                    delta0 = delta1;
                    lamda  = L + delta0;

                    double sinlamda = Math.Sin(lamda),
                           coslamda = Math.Cos(lamda);

                    double p = cos_u2 * sinlamda,
                           q = b1 - b2 * coslamda;


                    A1 = _2D_Point.Get_PAngle(_2D_Point.Origin, new _2D_Point(q, p)).ChangeToRad();

                    sin_xigema = p * Math.Sin(A1) + q * Math.Cos(A1);
                    cos_xigema = a1 + a2 * Math.Cos(lamda);
                    xigema     = Math.Atan(sin_xigema / cos_xigema);
                    if (cos_xigema < 0)
                    {
                        xigema = Math.PI - Math.Abs(xigema);
                    }
                    else
                    {
                        xigema = Math.Abs(xigema);
                    }
                    sinA0 = cos_u1 * Math.Sin(A1);

                    double sinA1       = Math.Sin(A1),
                           cosA1       = Math.Cos(A1),
                           tan_xigema1 = sin_u1 / cos_u1 / cosA1;
                    xigema1 = Math.Atan(tan_xigema1);
                    xigema2 = xigema + xigema1;

                    cos2A0 = 1 - sinA0 * sinA0;
                    double e_2   = ep.data.e_2,
                           e_4   = e_2 * e_2,
                           e_6   = e_2 * e_4,
                           Alph  = e_2 / 2 + e_4 / 8 + e_6 / 8 - (e_4 / 16 + e_6 / 16) * cos2A0 + 3 * e_6 / 128 * cos2A0 * cos2A0,
                           Beta  = (e_4 / 32 + e_6 / 32) * cos2A0 - e_6 / 64 * cos2A0 * cos2A0,
                           Beta1 = 2 * Beta / cos2A0;
                    delta1 = sinA0 * (Alph * xigema + Beta * (Math.Sin(2 * xigema2) - Math.Sin(2 * xigema1)));
                } while (Math.Abs(delta0 - delta1) * Methods.ρ > 0.0001);

                double k_2  = ep.data.e2_2 * cos2A0,
                       k_4  = k_2 * k_2,
                       k_6  = k_2 * k_4,
                       b    = ep.data.b,
                       A    = b * (1 + k_2 / 4 - 3 * k_4 / 64 + 5 * k_6 / 256),
                       B    = b * (k_2 / 8 - k_4 / 32 + 15 * k_6 / 1024),
                       C    = b * (k_4 / 128 - 3 * k_6 / 512),
                       B_pp = 2 * B / cos2A0,
                       C_pp = 2 * C / cos2A0 / cos2A0;

                double S  = A * xigema + (B + C * Math.Cos(2 * xigema1)) * Math.Sin(2 * xigema1) - Math.Sin(2 * xigema2) * (B + C * Math.Cos(2 * xigema2)),
                       p1 = cos_u1 * Math.Sin(lamda),
                       q1 = b1 * Math.Cos(lamda) - b2;
                var A21   = _2D_Point.Get_PAngle(_2D_Point.Origin, new _2D_Point(-q1, -p1));

                ge.S    = ge.Sr = S;
                ge.A21  = A21; ge.Ar21 = A21.ChangeToRad();
                ge.Ar12 = A1; ge.A12 = Angle.ChangeToAngle(A1);
            }
            ///// <summary>
            ///// 构造函数,自定义椭球
            ///// </summary>
            ///// <param name="a">椭球元素a</param>
            ///// <param name="b">椭球元素b</param>
            //public GeodeticSolution(double a, double b)
            //{
            //    ep = new Ellipsoid(a, b);
            //}

            /// <summary>
            /// 高斯平均引数法正算
            /// </summary>
            /// <param name="ge">已知条件</param>
            public void GaussPositive(GeodeticElement ge)
            {
                double e2_2     = ep.data.e2_2,
                       c        = ep.data.c,
                       Vm       = Auxiliary.GetV(e2_2, ge.Br1),
                       Mm       = c / Vm / Vm / Vm,
                       Nm       = c / Vm,
                       delta_B0 = Methods.ρ / Mm * ge.Sr * Math.Cos(ge.Ar12),
                       delta_L0 = Methods.ρ / Nm * ge.Sr * Math.Sin(ge.Ar12) / Math.Cos(ge.Br1),
                       delta_A0 = delta_L0 * Math.Sin(ge.Br1),
                       delta_B1 = delta_B0,
                       delta_L1 = delta_L0,
                       delta_A1 = delta_A0,
                       Bm,
                       Am,
                       tm,
                       yita_2;

                #region 迭代法求解
                do
                {
                    delta_B0 = delta_B1;
                    delta_L0 = delta_L1;
                    delta_A0 = delta_A1;
                    Bm       = ge.Br1 + delta_B0 / 2 / Methods.ρ;
                    Am       = ge.Ar12 + delta_A0 / 2 / Methods.ρ;
                    Vm       = Auxiliary.GetV(e2_2, Bm);
                    Nm       = c / Vm;
                    tm       = Auxiliary.Get_t(Bm);
                    yita_2   = Auxiliary.GetYita2(e2_2, Bm);

                    delta_B1 = Vm * Vm / Nm * Methods.ρ * ge.Sr * Math.Cos(Am) *
                               (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                                (Math.Sin(Am) * Math.Sin(Am) * (2 + 3 * tm * tm + 3 * yita_2 * tm * tm) +
                                 3 * yita_2 * Math.Cos(Am) * Math.Cos(Am) * (-1 + tm * tm - yita_2 - 4 * yita_2 * tm * tm)));

                    delta_L1 = Methods.ρ / Nm * ge.Sr * Math.Sin(Am) / Math.Cos(Bm) *
                               (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                                (Math.Sin(Am) * Math.Sin(Am) * tm * tm -
                                 Math.Cos(Am) * Math.Cos(Am) * (1 + yita_2 - 9 * yita_2 * tm * tm + yita_2 * yita_2)));

                    delta_A1 = Methods.ρ / Nm * ge.Sr * Math.Sin(Am) * tm *
                               (1 + ge.Sr * ge.Sr / 24 / Nm / Nm *
                                (Math.Cos(Am) * Math.Cos(Am) * (2 + 7 * yita_2 + 9 * yita_2 * tm * tm + 5 * yita_2 * yita_2) +
                                 Math.Sin(Am) * Math.Sin(Am) * (2 + tm * tm + 2 * yita_2)));
                }while(Math.Abs(delta_B1 - delta_B0) > 0.0001 ||
                       Math.Abs(delta_L1 - delta_L0) > 0.0001 ||
                       Math.Abs(delta_A1 - delta_A0) > 0.0001);
                #endregion

                ge.Br2 = ge.Br1 + delta_B1 / Methods.ρ;
                ge.B2  = Angle.ChangeToAngle(ge.Br2);
                ge.Lr2 = ge.Lr1 + delta_L1 / Methods.ρ;
                ge.L2  = Angle.ChangeToAngle(ge.Lr2);
                if (ge.Ar12 + delta_A1 / Methods.ρ >= Math.PI)
                {
                    ge.Ar21 = ge.Ar12 + delta_A1 / Methods.ρ - Math.PI;
                }
                else
                {
                    ge.Ar21 = ge.Ar12 + delta_A1 / Methods.ρ + Math.PI;
                }
                ge.A21 = Angle.ChangeToAngle(ge.Ar21);
            }