예제 #1
0
        public void Inv()
        {
            double degree = Math.PI / 180;
            double lat1 = phi1 / degree, lon1 = lam1 / degree, lat2 = phi2 / degree, lon2 = lam2 / degree;

            double azi1, azi2, s12;

            GlobalGeodesic.geod_inverse(lat1, lon1, lat2, lon2, out s12, out azi1, out azi2);

            azi2  += azi2 >= 0?-180:180;        // Compute back azimuth
            al12   = azi1 * degree;
            al21   = azi2 * degree;
            geod_S = s12;
        }
예제 #2
0
        // elliptical
        XY e_forward(LP lp)
        {
            XY xy;

            xy.x = xy.y = 0;

            double coslam = Math.Cos(lp.lam);
            double cosphi = Math.Cos(lp.phi);
            double sinphi = Math.Sin(lp.phi);

            switch (mode)
            {
            case aeqd_mode.N_POLE: coslam = -coslam; goto case aeqd_mode.S_POLE;

            case aeqd_mode.S_POLE:
                double rho = Math.Abs(Mp - Proj.pj_mlfn(lp.phi, sinphi, cosphi, en));
                xy.x = rho * Math.Sin(lp.lam);
                xy.y = rho * coslam;
                break;

            case aeqd_mode.EQUIT:
            case aeqd_mode.OBLIQ:
                if (Math.Abs(lp.lam) < EPS10 && Math.Abs(lp.phi - phi0) < EPS10)
                {
                    xy.x = xy.y = 0.0;
                    break;
                }

                double phi1 = phi0 * RHO;
                double lam1 = lam0 * RHO;
                double phi2 = lp.phi * RHO;
                double lam2 = (lp.lam + lam0) * RHO;

                double azi1, azi2, s12;
                g.geod_inverse(phi1, lam1, phi2, lam2, out s12, out azi1, out azi2);

                azi1 /= RHO;
                xy.x  = s12 * Math.Sin(azi1) / a;
                xy.y  = s12 * Math.Cos(azi1) / a;
                break;
            }

            return(xy);
        }