c# - 如何将 IList<T> 映射到位图?

标签 c# linq

IList 包含 xy 平面上的一组 z 样本(均为 double )。 GetColor() 将任何 z 值转换为像素颜色。 我计划缩放 IList x 和 y 限制以对应于位图宽度和高度,因为样本数通常不等于像素数。 样本是作为光栅扫描收集的,因此顺序不同。在扫描完成之前,我不知道有多少样本。 是否有使用 LINQ 和/或 Lambda 表达式为每个位图像素找到最接近的 IList x 和 y 的巧妙方法?

PictureBox pb;
Bitmap bmp = new Bitmap(pb.Width, pb.Height);
IList<Sample> samples = new List<Sample>();
// ... collect samples ...
// Find closest sample
Sample GetSample(int w, int h)
{
    // how to find closest x and y for each w and h?
}
// Map samples to bitmap
for (var w = 0; w < pb.Width; w++) 
{
    for (var h = 0; h < pb.Height; h++)
    {
        var sample = GetSample(w, h);
        var color = GetColor(sample.z, samples.Min().z, samples.Max().z);
        bmp.SetPixel(w, h, color);
    }
}
pb.Image = bmp;
Color GetColor(double z, double minZ, double maxZ)
{
    var red = (int) (255*(z - minZ)/(maxZ - minZ));
    var blue = 255 - red;
    var green = red*blue/65;
    return Color.FromArgb(red, green, blue);
}
// class Sample
public class Sample : IComparable<Sample>
{
    public double z { get; set; }
    public double x { get; set; }
    public double y { get; set; }
    int IComparable<Sample>.CompareTo(Sample s)
    {
        return z < s.z ? -1 : 1;
    }
}

最佳答案

也许我提供的方法可以帮助您,它可以找到最接近的数字。

找到最接近样本的问题是处理以下情况:

w == 1
h == 1

Sample(x = 1, y = 8)
Sample(x = 8, x = 1)

Which one should be considered as closest?

用法:

int closestX = this.FindClosest(samples.Select(p => p.x).ToList(), w);
int closestY = this.FindClosest(samples.Select(p => p.y).ToList(), h);

方法:

public int FindClosest(IList<int> points, int desiredNumber)
{
    int nearest = -1;
    int latestDistance = int.MaxValue;

    foreach (int t in points)
    {
        if (t == desiredNumber)
        {
            return t;
        }

        int currentDistance = Math.Abs(desiredNumber - t);
        if (currentDistance < latestDistance) 
        {                    
            nearest = t;
            latestDistance = currentDistance;
        }
    }

    return nearest;
}

关于c# - 如何将 IList<T> 映射到位图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7823418/

相关文章:

c# - 连接字符串 EF 设计器的存储位置

c# - 读取键为 System.Double 的嵌套 Lua 表

c# - 迭代 LINQ 实体结果

c# - ObjectQuery 和 "var"有什么区别?

c# - LINQ 混淆 - 数据库在应用程序关闭后不持久存在?

c# - 可以使用 LINQ 组合多个列表吗?

c# - EnterpriseLibraryContainer 实例何时创建?

c# - 如何从 HttpContext 获取 ASP.NET Core MVC 过滤器

javascript - 在 sweetalert Ok 弹出窗口后刷新当前页面

c# - 为什么 Entity Framework 中的子实体包含引用父实体的虚拟属性?