/// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <param name="parallel"></param>
        /// <returns></returns>
        public static PointCloud ToPointCloud <T>(this ISampledField3d <T> field, Func <T, Color> getColor, bool parallel = false)
            where T : struct
        {
            var cloud = new PointCloud(field.Points.Select(p => new Point3d(p.X, p.Y, 0.0)));

            if (parallel)
            {
                Parallel.ForEach(Partitioner.Create(0, field.Count), range => Body(range.Item1, range.Item2));
            }
            else
            {
                Body(0, field.Count);
            }

            void Body(int from, int to)
            {
                var vals = field.Values;

                for (int i = from; i < to; i++)
                {
                    cloud[i].Color = getColor(vals[i]);
                }
            }

            return(cloud);
        }
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <typeparam name="U"></typeparam>
        /// <param name="field"></param>
        /// <param name="other"></param>
        /// <param name="converter"></param>
        /// <param name="parallel"></param>
        public static void Sample <T, U>(this ISampledField3d <T> field, IField3d <U> other, Func <U, T> converter, bool parallel = false)
        {
            if (parallel)
            {
                Parallel.ForEach(Partitioner.Create(0, field.Count), range => Body(range.Item1, range.Item2));
            }
            else
            {
                Body(0, field.Count);
            }

            void Body(int from, int to)
            {
                var vals = field.Values;

                for (int i = from; i < to; i++)
                {
                    vals[i] = converter(other.ValueAt(field.PointAt(i)));
                }
            }
        }
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="field"></param>
 /// <returns></returns>
 public static ISampledField3d <T> Duplicate <T>(this ISampledField3d <T> field)
     where T : struct
 {
     return(field.Duplicate(true));
 }