/// <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); }
/// <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); } }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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); }
/// <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)); }
/// <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); }
/// <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); }