C# 简单的蓝到红范围功能

C# 简单的蓝到红范围功能,c#,C#,我基本上画了一条代表水流的线。我想给用户一个近似的水温,把它从100%的蓝色染成100%的红色。 我想;很简单,我两分钟就做完了。。 两个小时后,我看到了非常先进的色彩系统,而我所需要的只是一些非常简单的东西 我正在制作一个WinForm并使用系统。用钢笔绘图: Pen Pen1 = new Pen(Color.FromArgb(0, 0, 0, 0), 2); 我希望用这个输出Color类似的东西来创建一个输入(双精度)从-1到1的函数 Public Color TemperatureRan

我基本上画了一条代表水流的线。我想给用户一个近似的水温,把它从100%的蓝色染成100%的红色。 我想;很简单,我两分钟就做完了。。 两个小时后,我看到了非常先进的色彩系统,而我所需要的只是一些非常简单的东西

我正在制作一个WinForm并使用系统。用钢笔绘图:

Pen Pen1 = new Pen(Color.FromArgb(0, 0, 0, 0), 2);
我希望用这个输出
Color
类似的东西来创建一个输入(双精度)从-1到1的函数

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

以下是一种简单的线性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)

“更正确”的版本应该处理这个问题。您将需要转换方法,我已经使用过,然后它可能类似于:

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);
    }
}
public Color TemperatureRange(双值)
{
如果(值<0)
{
//蓝区
var max=新颜色RGB(颜色为蓝色);
var color=HSL的颜色RGB(最大高度,最大S*(-值),最大高度);
返回Color.FromArgb(Color.R,Color.G,Color.B);
}
其他的
{
//红场
var max=新颜色RGB(颜色为红色);
var color=ColorRGB.FromHSL(最大高度,最大S*值,最大高度);
返回Color.FromArgb(Color.R,Color.G,Color.B);
}
}
中间会产生某种灰色(演示由ScreenToGif制作):


以下是一种简单的线性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)

“更正确”的版本应该处理这个问题。您将需要转换方法,我已经使用过,然后它可能类似于:

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);
    }
}
public Color TemperatureRange(双值)
{
如果(值<0)
{
//蓝区
var max=新颜色RGB(颜色为蓝色);
var color=HSL的颜色RGB(最大高度,最大S*(-值),最大高度);
返回Color.FromArgb(Color.R,Color.G,Color.B);
}
其他的
{
//红场
var max=新颜色RGB(颜色为红色);
var color=ColorRGB.FromHSL(最大高度,最大S*值,最大高度);
返回Color.FromArgb(Color.R,Color.G,Color.B);
}
}
中间会产生某种灰色(演示由ScreenToGif制作):


如果您希望中间颜色为绿色,请尝试此选项

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));
}
公共静态色温表(双蓝)
{
双r,g,b;
//蓝到青色
如果(蓝色存储<-0.5)
{
r=0;
g=2+蓝色存储*2;
b=1;
}
//青绿
否则如果(蓝色存储<0)
{
r=0;
g=1;
b=-BlueToRed*2;
}
//绿到黄
否则,如果(蓝色存储<0.5)
{
r=蓝色存储*2;
g=1;
b=0;
}
//黄色到红色
其他的
{
r=1;
g=2-蓝色存储*2;
b=0;
}
返回颜色.FromArgb((int)(r*255),(int)(g*255),(int)(b*255));
}

如果您希望中间颜色为绿色,请尝试此选项

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));
}
公共静态色温表(双蓝)
{
双r,g,b;
//蓝到青色
如果(蓝色存储<-0.5)
{
r=0;
g=2+蓝色存储*2;
b=1;
}
//青绿
否则如果(蓝色存储<0)
{
r=0;
g=1;
b=-BlueToRed*2;
}
//绿到黄
否则,如果(蓝色存储<0.5)
{
r=蓝色存储*2;
g=1;
b=0;
}
//黄色到红色
其他的
{
r=1;
g=2-蓝色存储*2;
b=0;
}
返回颜色.FromArgb((int)(r*255),(int)(g*255),(int)(b*255));
}
你的意思是什么?我发现了一道数学题,你是说?我发现了一道数学题。