C# HSL颜色不正常

C# HSL颜色不正常,c#,colors,xna,game-engine,C#,Colors,Xna,Game Engine,我不是百分之百地明白我做错了什么。 我正在为我的定制引擎添加HSL颜色,而我的测试程序正在创建错误的颜色光谱 屏幕截图: 源代码: public Color toRGB() { float r = 0.0f; float g = 0.0f; float b = 0.0f; float v1, v2; if(_sat == 0.0f) { r = _lum; g = _lum; b = _lum;

我不是百分之百地明白我做错了什么。 我正在为我的定制引擎添加HSL颜色,而我的测试程序正在创建错误的颜色光谱 屏幕截图:

源代码:

public Color toRGB()
{
    float r = 0.0f;
    float g = 0.0f;
    float b = 0.0f;

    float v1, v2;

    if(_sat == 0.0f)
    {
        r = _lum;
        g = _lum;
        b = _lum;
    }
    else
    {
        if (_lum < 0.5f)
            v2 = _lum * (1.0f + _sat);
        else
            v2 = (_lum + _sat) - (_lum * _sat);

        v1 = 2.0f * _lum - v2;

        r = GetElement(v1, v2, (_hue / 360.0f) + (1.0f / 3.0f));
        g = GetElement(v1, v2, (_hue / 360.0f));
        b = GetElement(v1, v2, (_hue / 360.0f) - (1.0f / 3.0f));
    }
    return new Color(r, g, b);
}

private static float GetElement(float v1, float v2, float vH)
{
    if (vH < 0.0f)
        vH += 1.0f;
    else if (vH > 1.0f)
        vH -= 1.0f;

    if ((6.0f * vH) < 1.0f)
    return (v1 + (v2 - v1) * 6.0f * vH);
    if ((2.0f * vH) < 1.0f)
        return v2;
    if ((3.0f * vH) < 2.0f)
        return (v1 + (v2 - v1) * 6.0f * ((1.0f / 3.0f) - vH));
    return v1;
}
public Color toRGB()
{
浮球r=0.0f;
浮球g=0.0f;
浮球b=0.0f;
浮动v1,v2;
如果(_sat==0.0f)
{
r=_lum;
g=_lum;
b=_lum;
}
其他的
{
如果(_lum<0.5f)
v2=_lum*(1.0f+_sat);
其他的
v2=(_-lum+_-sat)-(_-lum*_-sat);
v1=2.0f*_lum-v2;
r=GetElement(v1,v2,(_色调/360.0f)+(1.0f/3.0f));
g=GetElement(v1,v2,(_色调/360.0f));
b=GetElement(v1,v2,(_色调/360.0f)-(1.0f/3.0f));
}
返回新颜色(r、g、b);
}
专用静态浮点元素(浮点v1、浮点v2、浮点vH)
{
中频(vH<0.0f)
vH+=1.0f;
否则,如果(vH>1.0f)
vH-=1.0f;
如果((6.0f*vH)<1.0f)
返回(v1+(v2-v1)*6.0f*vH);
中频((2.0f*vH)<1.0f)
返回v2;
如果((3.0f*vH)<2.0f)
返回(v1+(v2-v1)*6.0f*((1.0f/3.0f)-vH));
返回v1;
}
示例程序中的代码如下所示:

float width = GraphicsDevice.Viewport.Width;
float height = GraphicsDevice.Viewport.Height;

spriteBatch.Begin();
for (float x = 0.0f; x < width; x++)
{
    for (float y = 0.0f; y < height; y++)
    {
        HSLColor temp = new HSLColor(((x / width) * 360.0f), 0.5f, (y / height));
        DrawPixel(spriteBatch, (int)x, (int)y, temp.toRGB());
    }
}
float width=GraphicsDevice.Viewport.width;
浮动高度=GraphicsDevice.Viewport.height;
spriteBatch.Begin();
用于(浮动x=0.0f;x
只需几句话:我在使用微软XNA Famework。
我对使用其他库不感兴趣,甚至XNA也可能只是临时性的,这取决于此引擎的开发方式。

以下是我为
GetElement
所做的工作:

private static float GetElement(float v1, float v2, float vH)
{
    if (vH < 0.0f)
        vH += 1.0f;
    else if (vH > 1.0f)
        vH -= 1.0f;

    if (6.0f * vH < 1.0f) 
        return v1 + (v2 - v1) * 6.0f * vH;
    if (3.0f * vH < 1.0f)
        return v2;
    if (2.0f * vH < 1.0f)
        return v1 + (v2 - v1) * 6.0f * (0.5f - vH);
    return v1;
}

欢迎来到SO。知道你到底期望发生什么会很有帮助。
    r = GetElement(v1, v2, (_hue + 120.0f) / 360.0f);
    g = GetElement(v1, v2, _hue / 360.0f);
    b = GetElement(v1, v2, (_hue - 120.0f) / 360.0f);