/// <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 GridField2d <T> field, Func <T, Color> getColor, bool parallel = false)
            where T : struct
        {
            var cloud = new PointCloud(field.Coordinates.Select(p => new Point3d(p.X, p.Y, 0.0)));
            var vals  = field.Values;

            Action <Tuple <int, int> > body = range =>
            {
                for (int i = range.Item1; i < range.Item2; i++)
                {
                    cloud[i].Color = getColor(vals[i]);
                }
            };

            if (parallel)
            {
                Parallel.ForEach(Partitioner.Create(0, field.Count), body);
            }
            else
            {
                body(Tuple.Create(0, field.Count));
            }

            return(cloud);
        }
示例#2
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="field"></param>
 /// <param name="path"></param>
 /// <param name="mapper"></param>
 public static void SaveAsImage <T>(GridField2d <T> field, string path, Func <T, Color> mapper)
     where T : struct
 {
     using (Bitmap bmp = new Bitmap(field.CountX, field.CountY, PixelFormat.Format32bppArgb))
     {
         WriteToImage(field, bmp, mapper);
         bmp.Save(path);
     }
 }
示例#3
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <returns></returns>
        public static Mesh ToPolySoup <T>(this GridField2d <T> field, Func <T, Color> getColor)
            where T : struct
        {
            var mesh   = new Mesh();
            var verts  = mesh.Vertices;
            var colors = mesh.VertexColors;
            var faces  = mesh.Faces;

            var values = field.Values;

            (var nx, var ny) = field.Count;
            (var dx, var dy) = (field.Scale * 0.5);

            int index = 0;

            // add vertices
            for (int x = 0; x < ny; x++)
            {
                for (int y = 0; y < nx; y++)
                {
                    var p = field.ToWorldSpace(new Vector2d(y, x));
                    verts.Add(p.X - dx, p.Y - dy, 0.0);
                    verts.Add(p.X + dx, p.Y - dy, 0.0);
                    verts.Add(p.X - dx, p.Y + dy, 0.0);
                    verts.Add(p.X + dx, p.Y + dy, 0.0);

                    var c = getColor(values[index++]);
                    for (int k = 0; k < 4; k++)
                    {
                        colors.Add(c);
                    }
                }
            }

            // add faces
            for (int i = 0; i < verts.Count; i += 4)
            {
                faces.AddFace(i, i + 1, i + 3, i + 2);
            }

            return(mesh);
        }
示例#4
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <returns></returns>
        public static Mesh ToPolySoup <T>(this GridField2d <T> field, Func <T, Color> getColor)
            where T : struct
        {
            Mesh mesh   = new Mesh();
            var  verts  = mesh.Vertices;
            var  colors = mesh.VertexColors;
            var  faces  = mesh.Faces;

            var values = field.Values;

            (var dx, var dy) = (field.Scale * 0.5);

            int index = 0;

            // add vertices
            for (int i = 0; i < field.CountY; i++)
            {
                for (int j = 0; j < field.CountX; j++)
                {
                    Vec2d p = field.CoordinateAt(j, i);
                    verts.Add(p.X - dx, p.Y - dy, 0.0);
                    verts.Add(p.X + dx, p.Y - dy, 0.0);
                    verts.Add(p.X - dx, p.Y + dy, 0.0);
                    verts.Add(p.X + dx, p.Y + dy, 0.0);

                    var c = getColor(values[index++]);
                    for (int k = 0; k < 4; k++)
                    {
                        colors.Add(c);
                    }
                }
            }

            // add faces
            for (int i = 0; i < verts.Count; i += 4)
            {
                faces.AddFace(i, i + 1, i + 3, i + 2);
            }

            return(mesh);
        }
示例#5
0
        /// <summary>
        ///
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <param name="selection"></param>
        /// <returns></returns>
        public static Mesh ToPolySoup <T>(this GridField2d <T> field, Func <T, Color> getColor, IEnumerable <int> selection)
            where T : struct
        {
            var mesh   = new Mesh();
            var verts  = mesh.Vertices;
            var colors = mesh.VertexColors;
            var faces  = mesh.Faces;

            var values = field.Values;

            (var dx, var dy) = (field.Scale * 0.5);

            // add vertices
            foreach (int index in selection)
            {
                var p = field.ToWorldSpace(index);

                verts.Add(p.X - dx, p.Y - dy, 0.0);
                verts.Add(p.X + dx, p.Y - dy, 0.0);
                verts.Add(p.X - dx, p.Y + dy, 0.0);
                verts.Add(p.X + dx, p.Y + dy, 0.0);

                var c = getColor(values[index]);
                for (int k = 0; k < 4; k++)
                {
                    colors.Add(c);
                }
            }

            // add faces
            for (int i = 0; i < verts.Count; i += 4)
            {
                faces.AddFace(i, i + 1, i + 3, i + 2);
            }

            return(mesh);
        }
示例#6
0
        /// <summary>
        /// Converts the field to a colored heightfield mesh.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <param name="getHeight"></param>
        /// <returns></returns>
        public static Mesh ToMesh <T>(this GridField2d <T> field, Func <T, Color> getColor, Func <T, double> getHeight)
            where T : struct
        {
            Mesh mesh   = new Mesh();
            var  verts  = mesh.Vertices;
            var  colors = mesh.VertexColors;
            var  faces  = mesh.Faces;

            var values = field.Values;
            int index  = 0;

            for (int j = 0; j < field.CountY; j++)
            {
                for (int i = 0; i < field.CountX; i++)
                {
                    var t = values[index++];

                    Vec2d p = field.CoordinateAt(i, j);
                    verts.Add(p.X, p.Y, getHeight(t));
                    colors.Add(getColor(t));
                }
            }

            int nx = field.CountX;
            int ny = field.CountY;

            for (int j = 0; j < ny - 1; j++)
            {
                for (int i = 0; i < nx - 1; i++)
                {
                    index = field.IndexAtUnsafe(i, j);
                    faces.AddFace(index, index + 1, index + 1 + nx, index + nx);
                }
            }

            return(mesh);
        }
示例#7
0
        /// <summary>
        /// Converts the field to a colored heightfield mesh.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="field"></param>
        /// <param name="getColor"></param>
        /// <param name="getHeight"></param>
        /// <returns></returns>
        public static Mesh ToMesh <T>(this GridField2d <T> field, Func <T, Color> getColor, Func <T, double> getHeight)
            where T : struct
        {
            var mesh   = new Mesh();
            var verts  = mesh.Vertices;
            var colors = mesh.VertexColors;
            var faces  = mesh.Faces;

            var values = field.Values;

            (var nx, var ny) = field.Count;
            int index = 0;

            for (int y = 0; y < ny; y++)
            {
                for (int x = 0; x < nx; x++)
                {
                    var t = values[index++];

                    Vector2d p = field.ToWorldSpace(new Vector2d(x, y));
                    verts.Add(p.X, p.Y, getHeight(t));
                    colors.Add(getColor(t));
                }
            }

            for (int y = 0; y < ny - 1; y++)
            {
                for (int x = 0; x < nx - 1; x++)
                {
                    index = field.ToIndexUnsafe(new Vector2i(x, y));
                    faces.AddFace(index, index + 1, index + 1 + nx, index + nx);
                }
            }

            return(mesh);
        }
示例#8
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="field"></param>
 /// <param name="getColor"></param>
 /// <returns></returns>
 public static Mesh ToMesh <T>(this GridField2d <T> field, Func <T, Color> getColor)
     where T : struct
 {
     return(ToMesh(field, getColor, t => 0.0));
 }
示例#9
0
 /// <summary>
 /// Writes the given field to an existing image.
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="field"></param>
 /// <param name="mapper"></param>
 /// <param name="image"></param>
 public static void WriteToImage <T>(GridField2d <T> field, Bitmap image, Func <T, Color> mapper)
     where T : struct
 {
     WriteToImage(field.Values, 0, image, mapper);
 }
示例#10
0
 /// <summary>
 ///
 /// </summary>
 /// <typeparam name="T"></typeparam>
 /// <param name="field"></param>
 /// <param name="mapper"></param>
 /// <param name="image"></param>
 public static void ReadFromImage <T>(Bitmap image, GridField2d <T> field, Func <Color, T> mapper)
     where T : struct
 {
     ReadFromImage(image, field.Values, 0, mapper);
 }