コード例 #1
0
        private void Lengths(EllipticFunction E,
                             double sig12,
                             double ssig1, double csig1, double dn1,
                             double ssig2, double csig2, double dn2,
                             double cbet1, double cbet2, GeodesicFlags outmask,
                             out double s12b, out double m12b, out double m0,
                             out double M12, out double M21)
        {
            // Return m12b = (reduced length)/_b; also calculate s12b = distance/_b,
            // and m0 = coefficient of secular term in expression for reduced length.
            s12b = m12b = m0 = M12 = M21 = double.NaN;

            outmask = outmask.Flags();
            // outmask & DISTANCE: set s12b
            // outmask & REDUCEDLENGTH: set m12b & m0
            // outmask & GEODESICSCALE: set M12 & M21

            // It's OK to have repeated dummy arguments,
            // e.g., s12b = m0 = M12 = M21 = dummy

            if (outmask.HasAny(GeodesicFlags.Distance))
            {
                // Missing a factor of _b
                s12b = E.E() / (PI / 2) *
                       (sig12 + (E.DeltaE(ssig2, csig2, dn2) - E.DeltaE(ssig1, csig1, dn1)));
            }
            if (outmask.HasAny(GeodesicFlags.ReducedLength | GeodesicFlags.GeodesicScale))
            {
                double
                    m0x = -E.K2 * E.D() / (PI / 2),
                    J12 = m0x *
                          (sig12 + (E.DeltaD(ssig2, csig2, dn2) - E.DeltaD(ssig1, csig1, dn1)));
                if (outmask.HasAny(GeodesicFlags.ReducedLength))
                {
                    m0 = m0x;
                    // Missing a factor of _b.  Add parens around (csig1 * ssig2) and
                    // (ssig1 * csig2) to ensure accurate cancellation in the case of
                    // coincident points.
                    m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) -
                           csig1 * csig2 * J12;
                }
                if (outmask.HasAny(GeodesicFlags.GeodesicScale))
                {
                    var csig12 = csig1 * csig2 + ssig1 * ssig2;
                    var t      = _ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2);
                    M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1;
                    M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2;
                }
            }
        }
コード例 #2
0
 /// <summary>
 /// Inverse of <see cref="RectifyingLatitude(double)"/>.
 /// </summary>
 /// <param name="mu">the rectifying latitude (degrees).</param>
 /// <returns>φ, the geographic latitude (degrees).</returns>
 /// <remarks>
 /// µ must lie in the range [-90°, 90°]; the
 /// result is undefined if this condition does not hold.The returned value
 /// φ lies in [-90°, 90°].
 /// </remarks>
 public double InverseRectifyingLatitude(double mu)
 => Abs(mu) == 90 ? mu
         : InverseParametricLatitude(_ell.Einv(mu * _ell.E() / 90) / Degree);