예제 #1
0
        // 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);
        }