/// <inheritdoc /> protected override void EllipticalInverse(double[] xy, double[] lp, int startIndex, int numPoints) { for (int i = startIndex; i < startIndex + numPoints; i++) { int phi = i * 2 + PHI; int lam = i * 2 + LAMBDA; int x = i * 2 + X; int y = i * 2 + Y; double ab; double cx = xy[x]; double cy = xy[y]; if (_mode == Modes.Equitorial || _mode == Modes.Oblique) { double rho = Proj.Hypot(cx /= _dd, cy * _dd); if (rho < EPS10) { lp[lam] = 0; lp[phi] = Phi0; return; } double sCe; double cCe = Math.Cos(sCe = 2 * Math.Asin(.5 * rho / _rq)); cx *= (sCe = Math.Sin(sCe)); if (_mode == Modes.Oblique) { ab = cCe * _sinb1 + y * sCe * _cosb1 / rho; //q = _qp*(ab); cy = rho * _cosb1 * cCe - cy * _sinb1 * sCe; } else { ab = cy * sCe / rho; //q = _qp*(ab); cy = rho * cCe; } } else { if (_mode == Modes.NorthPole) { cy = -cy; } double q; if ((q = (cx * cx + cy * cy)) == 0) { lp[lam] = 0; lp[phi] = Phi0; return; } ab = 1 - q / _qp; if (_mode == Modes.SouthPole) { ab = -ab; } } lp[lam] = Math.Atan2(cx, cy); lp[phi] = Proj.AuthLat(Math.Asin(ab), _apa); } }
/// <inheritdoc /> protected override void EllipticalInverse(double[] xy, double[] lp, int startIndex, int numPoints) { for (int i = startIndex; i < startIndex + numPoints; i++) { int phi = i * 2 + PHI; int lam = i * 2 + LAMBDA; int x = i * 2 + X; int y = i * 2 + Y; lp[phi] = Proj.AuthLat(Math.Asin(2 * xy[y] * K0 / _qp), _apa); lp[lam] = xy[x] / K0; } }