/// <summary>
        /// Calculate the three dimensional geodetic measurement between two positions
        /// measured in reference to a specified ellipsoid.
        /// This calculation is performed by first computing a new ellipsoid by expanding or contracting
        /// the reference ellipsoid such that the new ellipsoid passes through the average elevation
        /// of the two positions.  A geodetic curve across the new ellisoid is calculated.  The
        /// point-to-point distance is calculated as the hypotenuse of a right triangle where the length
        /// of one side is the ellipsoidal distance and the other is the difference in elevation.
        /// </summary>
        /// <param name="start">starting position</param>
        /// <param name="end">ending position</param>
        /// <returns>The geodetic measurement information to get from start to end</returns>
        public GeodeticMeasurement CalculateGeodeticMeasurement(
            GlobalPosition start,
            GlobalPosition end)
        {
            // get the coordinates
            var startCoords = start.Coordinates;
            var endCoords   = end.Coordinates;

            // calculate elevation differences
            var elev1  = start.Elevation;
            var elev2  = end.Elevation;
            var elev12 = (elev1 + elev2) / 2.0;

            // calculate latitude differences
            var phi1  = startCoords.Latitude.Radians;
            var phi2  = endCoords.Latitude.Radians;
            var phi12 = (phi1 + phi2) / 2.0;

            // calculate a new ellipsoid to accommodate average elevation
            var refA      = ReferenceGlobe.SemiMajorAxis;
            var f         = ReferenceGlobe.Flattening;
            var a         = refA + elev12 * (1.0 + f * Math.Sin(phi12));
            var ellipsoid = Ellipsoid.FromAAndF(a, f);
            var geoCalc   = new GeodeticCalculator(ellipsoid);

            // calculate the curve at the average elevation
            var averageCurve =
                geoCalc.CalculateGeodeticCurve(startCoords, endCoords);

            // return the measurement
            return(new GeodeticMeasurement(averageCurve, elev2 - elev1));
        }
        public void TestFactory1()
        {
            var e = Ellipsoid.FromAAndF(100000, 0.01);

            Assert.AreEqual(e.SemiMinorAxis, (1 - 0.01) * 100000);
            Assert.AreEqual(100, e.InverseFlattening);
            Assert.AreEqual(100000, e.SemiMajorAxis);
            Assert.AreEqual(e.Ratio, 1.0 - 0.01);
        }