/// <summary>
        /// Initializes a new instance tangent to <paramref name="ellipsoid"/> at
        /// the center of a bounded set of <paramref name="positions"/>.
        /// </summary>
        /// <param name="ellipsoid">The ellipsoid .</param>
        /// <param name="positions"></param>
        public EllipsoidTangentPlane(Ellipsoid ellipsoid, IList <Cartesian> positions)
        {
            if (ellipsoid == null)
            {
                throw new ArgumentNullException("ellipsoid");
            }

            if (positions == null)
            {
                throw new ArgumentNullException("positions");
            }

            if (positions.Count < 1)
            {
                throw new ArgumentOutOfRangeException("positions", "At least one position is required.");
            }

            AxisAlignedBoundingBox box = new AxisAlignedBoundingBox(positions);

            _origin = ellipsoid.ScaleToGeodeticSurface(box.Center);
            _normal = ellipsoid.GeodeticSurfaceNormal(_origin);
            _d      = -_origin.Dot(_origin);
            _yAxis  = _origin.Cross(_origin.MostOrthogonalAxis).Normalize();
            _xAxis  = _yAxis.Cross(_origin).Normalize();
        }
        /// <summary>
        /// Initializes a new instance tangent to <paramref name="ellipsoid"/> at 
        /// the center of a bounded set of <paramref name="positions"/>.
        /// </summary>
        /// <param name="ellipsoid">The ellipsoid .</param>
        /// <param name="positions"></param>
        public EllipsoidTangentPlane(Ellipsoid ellipsoid, IList<Cartesian> positions)
        {
            if (ellipsoid == null)
            {
                throw new ArgumentNullException("ellipsoid");
            }

            if (positions == null)
            {
                throw new ArgumentNullException("positions");
            }

            if (positions.Count < 1)
            {
                throw new ArgumentOutOfRangeException("positions", "At least one position is required.");
            }

            AxisAlignedBoundingBox box = new AxisAlignedBoundingBox(positions);

            _origin = ellipsoid.ScaleToGeodeticSurface(box.Center);
            _normal = ellipsoid.GeodeticSurfaceNormal(_origin);
            _d = -_origin.Dot(_origin);
            _yAxis = _origin.Cross(_origin.MostOrthogonalAxis).Normalize();
            _xAxis = _yAxis.Cross(_origin).Normalize();
        }