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; }
// 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); }