/// <summary> /// Performs the inverse transfrom from a single coordinate of linear units to the same coordinate in geodetic units /// </summary> /// <param name="xy">The double linear input x and y values organized into a 1 dimensional array</param> /// <param name="lp">The double geodetic output lambda and phi values organized into a 1 dimensional array</param> /// <param name="startIndex">The zero based integer start index</param> /// <param name="numPoints">The integer count of the number of xy pairs in the lp and xy arrays</param> protected override void EllipticalInverse(double[] xy, double[] lp, int startIndex, int numPoints) { for (int i = startIndex; i < startIndex + numPoints; i++) { int phi = i * 2 + PHI; int lam = i * 2 + LAMBDA; int x = i * 2 + X; int y = i * 2 + Y; lp[phi] = MeridionalDistance.AngularDistance(_ml0 + xy[y] / K0, Es, _en); if (Math.Abs(lp[phi]) >= HALF_PI) { lp[phi] = xy[y] < 0 ? -HALF_PI : HALF_PI; lp[lam] = 0; } else { double sinphi = Math.Sin(lp[phi]); double cosphi = Math.Cos(lp[phi]); double t = Math.Abs(cosphi) > 1e-10 ? sinphi / cosphi : 0; double n = _esp * cosphi * cosphi; double con; double d = xy[x] * Math.Sqrt(con = 1 - Es * sinphi * sinphi) / K0; con *= t; t *= t; double ds = d * d; lp[phi] -= (con * ds / (1 - Es)) * FC2 * (1 - ds * FC4 * (5 + t * (3 - 9 * n) + n * (1 - 4 * n) - ds * FC6 * (61 + t * (90 - 252 * n + 45 * t) + 46 * n - ds * FC8 * (1385 + t * (3633 + t * (4095 + 1574 * t)))))); lp[lam] = d * (FC1 - ds * FC3 * (1 + 2 * t + n - ds * FC5 * (5 + t * (28 + 24 * t + 8 * n) + 6 * n - ds * FC7 * (61 + t * (662 + t * (1320 + 720 * t)))))) / cosphi; } } }
/// <summary> /// /// </summary> /// <param name="arg"></param> /// <param name="es"></param> /// <param name="en"></param> /// <returns></returns> public static double InvMlfn(double arg, double es, double[] en) { return(MeridionalDistance.AngularDistance(arg, es, en)); }