简单的蓝色到红色范围功能

时间:2019-01-23 10:13:01

标签: c#

我基本上是画一条代表水流的线。我想通过将水的颜色从100%蓝色着色为100%红色来为用户提供近似的水温。 我虽然这很简单,我只用了2分钟就完成了。 两个小时后,我需要的是非常简单的东西,我正在研究一种非常高级的色彩系统。

我正在制作WinForm并使用System.Draw和笔:

Pen Pen1 = new Pen(Color.FromArgb(0, 0, 0, 0), 2);

我希望使用输入(Double)从-1到1的函数,并且输出Color类似

Public Color TemperatureRange(double BlueToRed)
    {

     Color MyColor = new Color();
     byte a, r, g, b;

     //Insert math function that take from -1 to 1 and
     //produces and argb-output ranging from blue to red

     MyColor = Color.FromArgb(a, r, g, b);

     return MyColor;
    }

2 个答案:

答案 0 :(得分:1)

这是一种简单的线性RGB缩放方法:

public Color TemperatureRange(double value)
{
    // start = blue = #0000FF
    // end = red = #FF0000
    // range [-1; 1]
    var r = (int)(0xff * (value + 1) / 2);
    var g = 0;
    var b = (int)(0xff * (1 - value) / 2);
    return Color.FromArgb(r, g, b);
}

在中间它会产生Color.Purple(#800080)。

“更正确”的版本应处理HSL。您将需要转换方法,我用过this class,然后可能是这样的:

public Color TemperatureRange(double value)
{
    if (value < 0)
    {
        // blue range
        var max = new ColorRGB(Color.Blue);
        var color = ColorRGB.FromHSL(max.H, max.S * (-value), max.L);
        return Color.FromArgb(color.R, color.G, color.B);
    }
    else
    {
        // red range
        var max = new ColorRGB(Color.Red);
        var color = ColorRGB.FromHSL(max.H, max.S * value, max.L);
        return Color.FromArgb(color.R, color.G, color.B);
    }
}

在中间会产生某种灰色(演示是由ScreenToGif制作的):

答案 1 :(得分:1)

如果您希望中间颜色为绿色,请尝试此操作。

public static Color TemperatureRange(double BlueToRed)
{
    double r, g, b;

    // blue to cyan
    if (BlueToRed < -0.5)
    {
        r = 0;
        g = 2 + BlueToRed * 2;
        b = 1;
    }

    // cyan to green
    else if (BlueToRed < 0)
    {
        r = 0;
        g = 1;
        b = -BlueToRed * 2;
    }

    // green to yellow
    else if (BlueToRed < 0.5)
    {
        r = BlueToRed * 2;
        g = 1;
        b = 0;
    }

    // yellow to red
    else
    {
        r = 1;
        g = 2 - BlueToRed * 2;
        b = 0;
    }

    return Color.FromArgb((int)(r * 255), (int)(g * 255), (int)(b * 255));
}