难以转换颜色

时间:2012-05-01 15:00:13

标签: c# .net colors gradient

我在地图上有GRP曲目,从1到10有困难。我希望这些曲目根据难度有不同的颜色。容易的难度是绿色,硬是红色,中等是橙色。但是,我需要的不仅仅是这3种颜色,而是它们之间更平滑的过渡。像每个难度点的一种颜色或每个半点的一种颜色。有没有算法来计算这些颜色和他们的过渡?像某种方式增加/减少rgb值?谢谢。

3 个答案:

答案 0 :(得分:1)

Red = 255,0,0
Yellow = 255, 255, 0
Green = 0,255,0

创建一个从1级到10级循环的for循环。

对于每个级别,将颜色创建为:

Red = level * 25.5;
Green = 255 - (level * 25.5);
Blue = 0;

然后从RGB值创建颜色。

显然这只是伪代码,但它应该让你有一个开始的想法。

答案 1 :(得分:1)

您正在寻找的是跨颜色插值的能力。简单地插入两种颜色可能是不够的(因为你可能会在两种颜色之间产生虚假颜色),但是将每种颜色的RGB视为3D空间中的一个点并沿着多边形进行插值(其中每个点都是颜色/中间颜色) )代表颜色(在你的情况下,困难)。 Here是一个显示我正在谈论的内容的链接。

答案 2 :(得分:0)

using System;
using System.Drawing;
using System.Windows.Forms;

public partial class MainForm : Form
{
    protected override void OnPaint(PaintEventArgs e)
    {
        Color[] colors = new Color[11];

        colors[0] = Color.Green;
        colors[1] = Interpolate(Color.Green, Color.Orange, 0.2);
        colors[2] = Interpolate(Color.Green, Color.Orange, 0.4);
        colors[3] = Interpolate(Color.Green, Color.Orange, 0.6);
        colors[4] = Interpolate(Color.Green, Color.Orange, 0.8);
        colors[5] = Color.Orange;
        colors[6] = Interpolate(Color.Orange, Color.Red, 0.2);
        colors[7] = Interpolate(Color.Orange, Color.Red, 0.4);
        colors[8] = Interpolate(Color.Orange, Color.Red, 0.6);
        colors[9] = Interpolate(Color.Orange, Color.Red, 0.8);
        colors[10] = Color.Red;

        Rectangle rect = new Rectangle(10, 10, 20, 90);
        for (int i = 0; i < colors.Length; i++)
        {
            e.Graphics.FillRectangle(new SolidBrush(colors[i]), rect);
            rect.Offset(20, 0);
        }

        base.OnPaint(e);
    }

    private static Color Interpolate(Color a, Color b, double t)
    {
        int R = (int)(a.R + (b.R - a.R) * t);
        int G = (int)(a.G + (b.G - a.G) * t);
        int B = (int)(a.B + (b.B - a.B) * t);
        return Color.FromArgb(R, G, B);
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new MainForm());
    }
}