// ellipsoid LP e_inverse(XY xy) { LP lp; lp.lam = lp.phi = 0; xy.x /= k0; xy.y /= k0; double rho = Libc.hypot(xy.x, xy.y); if (rho != 0) { double c = 2.0 * Math.Atan2(rho, R2); double sinc = Math.Sin(c); double cosc = Math.Cos(c); lp.phi = Math.Asin(cosc * sinc0 + xy.y * sinc * cosc0 / rho); lp.lam = Math.Atan2(xy.x * sinc, rho * cosc0 * cosc - xy.y * sinc0 * sinc); } else { lp.phi = phic0; lp.lam = 0.0; } return(GAUSS.pj_inv_gauss(ctx, lp, en)); }
// ellipsoid XY e_forward(LP lp) { XY xy; xy.x = xy.y = 0; lp = GAUSS.pj_gauss(ctx, lp, en); double sinc = Math.Sin(lp.phi); double cosc = Math.Cos(lp.phi); double cosl = Math.Cos(lp.lam); double k = k0 * R2 / (1.0 + sinc0 * sinc + cosc0 * cosc * cosl); xy.x = k * cosc * Math.Sin(lp.lam); xy.y = k * (cosc0 * sinc - sinc0 * cosc * cosl); return(xy); }
public override PJ Init() { double R; en = GAUSS.pj_gauss_ini(e, phi0, out phic0, out R); if (en == null) { return(null); } sinc0 = Math.Sin(phic0); cosc0 = Math.Cos(phic0); R2 = 2.0 * R; inv = e_inverse; fwd = e_forward; return(this); }