【问题标题】:Mapping number to colors将数字映射到颜色
【发布时间】:2018-01-24 07:55:38
【问题描述】:

我目前正在使用 C# (UWP) 开发一个应用程序,作为一个附带问题(不是我正在处理的主要问题)我需要将一些数字映射到颜色。

现在的限制是: 1) 可能选项的数量是可变的。 (所以它不是“四种”颜色或类似的东西,而是每次程序运行时都不同)

2) 颜色必须足够可区分。

现在,结果可以是一个 RGB 字节数组。 任何有关如何执行此操作的建议将不胜感激。

【问题讨论】:

  • 我猜“可区分”意味着接近的数字应具有巨大的色差,并且每种颜色与其他颜色应具有最小“距离”。那是对的吗? (例如:“1” => 红色,“2” => 完全不同的颜色,而“100000”可能具有红色映射但仍可与“1”的映射区分开来)
  • #RRGGBB 只是一个 3 字节的数字。任何 3 字节数字都可以,并且会产生独特的颜色。请澄清你的意思。你的意思是你需要颜色搭配得很好?
  • "颜色必须足够区分。"我建议阅读一些关于视觉感知的文献。至于其余的Color.FromRgb 方法可能会对您有所帮助

标签: c# colors


【解决方案1】:

这样的代码怎么样?

        List<int> nums = new List<int> { 130049, 652, 832 }; //your numbers to map
        List<byte[]> colors = new List<byte[]>(); //to store byte[] objects
        int squared = 255 * 255;

        foreach (int n in nums)
        {
            var RGBBytes = new byte[3] { 0, 0, 0 }; //RGB values

            decimal quotient = n / squared;
            var mod = n % squared;
            byte theByte = (byte)Math.Floor(quotient);
            RGBBytes[0] = theByte;

            quotient = mod / 255;
            mod = mod % 255;
            theByte = (byte)Math.Floor(quotient);
            RGBBytes[1] = theByte;

            theByte = (byte)Math.Floor((decimal)mod);
            RGBBytes[2] = theByte;

            colors.Add(RGBBytes); //saving RGB values for a color
        }

        Console.WriteLine(string.Join("\n", colors.Select(c => string.Join("-", c))));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-14
    • 2010-10-04
    • 2012-03-19
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 2010-11-19
    • 2011-09-02
    相关资源
    最近更新 更多