// elliptical LP e_inverse(XY xy) { LP lp; lp.lam = lp.phi = 0; double c = Libc.hypot(xy.x, xy.y); if (c < EPS10) { lp.phi = phi0; lp.lam = 0.0; return(lp); } if (mode == aeqd_mode.OBLIQ || mode == aeqd_mode.EQUIT) { double x2 = xy.x * a; double y2 = xy.y * a; double lat1 = phi0 * RHO; double lon1 = lam0 * RHO; double azi1 = Math.Atan2(x2, y2) * RHO; double s12 = Math.Sqrt(x2 * x2 + y2 * y2); double lat2, lon2, azi2; g.geod_direct(lat1, lon1, azi1, s12, out lat2, out lon2, out azi2); lp.phi = lat2 / RHO; lp.lam = lon2 / RHO; lp.lam -= lam0; } else { // Polar lp.phi = Proj.pj_inv_mlfn(ctx, mode == aeqd_mode.N_POLE?Mp - c:Mp + c, es, en); lp.lam = Math.Atan2(xy.x, mode == aeqd_mode.N_POLE?-xy.y:xy.y); } return(lp); }