///// <summary>
        ///// Create a new object as copy of this instance.
        ///// </summary>
        //public override Coordinate Copy()
        //{
        //    return new CoordinateZ(X, Y, Z);
        //}

        /// <summary>
        /// Computes the 3-dimensional Euclidean distance to another location.
        /// </summary>
        /// <param name="c">A <see cref="CoordinateZ"/> with which to do the distance comparison.</param>
        /// <returns>the 3-dimensional Euclidean distance between the locations.</returns>
        public double Distance3D(CoordinateZ c)
        {
            double dx = X - c.X;
            double dy = Y - c.Y;
            double dz = Z - c.Z;

            if (double.IsNaN(dz))
            {
                dz = 0;
            }
            return(Math.Sqrt(dx * dx + dy * dy + dz * dz));
        }
 /// <summary>
 /// Tests if another CoordinateZ has the same value for Z, within a tolerance.
 /// </summary>
 /// <param name="c">A <see cref="CoordinateZ"/>.</param>
 /// <param name="tolerance">The tolerance value.</param>
 /// <returns><c>true</c> if the Z ordinates are within the given tolerance.</returns>
 public bool EqualInZ(CoordinateZ c, double tolerance)
 {
     return(EqualsWithTolerance(this.Z, c.Z, tolerance));
 }
 /// <summary>
 /// Returns <c>true</c> if <paramref name="other"/>
 /// has the same values for X, Y and Z.
 /// </summary>
 /// <param name="other">A <see cref="CoordinateZ"/> with which to do the 3D comparison.</param>
 /// <returns>
 /// <c>true</c> if <paramref name="other"/> is a <see cref="CoordinateZ"/>
 /// with the same values for X, Y and Z.
 /// </returns>
 public bool Equals3D(CoordinateZ other)
 {
     return((X == other.X) && (Y == other.Y) &&
            ((Z == other.Z) || (double.IsNaN(Z) && double.IsNaN(other.Z))));
 }