HSV到RGB停止在黄色C#黄色、HSV、RGB

2023-09-03 06:09:50 作者:花非花情调° ˉ2m

我在写一个HSVtoRGB方法为我的游戏框架,并通过色彩去的时候,出现这种情况 - > HTTP:/ /youtu.be/ACBwR_0iMWE 。

下面是code。

 公共静态颜色HSVtoRGB(浮动色调,饱和度浮动,浮点值,浮阿尔法)
    {
        如果(色调→1 ||饱和度大于1 ||值大于1)抛出新的异常(值不能超过1个!);
        如果(色调℃,||饱和℃的||值小于0)抛出新的异常(值不能小于0!);

        彩色输出=新颜色();
        如果(Math.Abs​​(饱和)&所述0.001)
        {
            output.R =(字节)(值* byte.MaxValue);
            output.G =(字节)(值* byte.MaxValue);
            output.B =(字节)(值* byte.MaxValue);
        }
        其他
        {
            色相=色相/ 60F;
            浮动F =色调 - (INT)的色相;
            浮动P =值*(1F  - 饱和度);
            浮q =值*(1F  - 饱和* F);
            浮动T =值*(1F  - 饱和度*(1F  -  F));
            开关((int)的色调)
            {
                情况下(0):
                    输出=新颜色(值* 255,T * 255,P * 255,阿尔法);
                    打破;
                情况1):
                    输出=新颜色(Q * 255,值* 255,P * 255,阿尔法);
                    打破;
                壳体(2):
                    输出=新颜色(P * 255,值* 255,T * 255,阿尔法);
                    打破;
                情况下(3):
                    输出=新颜色(P * 255,Q * 255,值* 255,阿尔法);
                    打破;
                壳体(4):
                    输出=新的色彩(T * 255,P * 255,值* 255,阿尔法);
                    打破;
                壳体(5):
                    输出=新颜色(值* 255,P * 255,Q * 255,阿尔法);
                    打破;
                默认 :
                    抛出新的异常(RGB色彩不明!);
            }

        }
        返回输出;
    }
 

在加入 .001f 的色调,这导致它去从红色到黄色,但随后执着在黄色的,直到它回滚至0。请注意,我使用 Microsoft.Xna.Framework.Color 不是的System.Drawing.Color

收藏 58个设计师最佳配色工具网站

有关引用,这里是 Flixel电动工具中的HSVtoRGB方法,基本上是我我试图复制。

 公共静态函数HSVtoRGB(H:编号,S:号码,V:数字,字母:UINT = 255):UINT
    {
        VAR结果:UINT;

        如果(S == 0.0)
        {
            结果= getColor32(α,V * 255,V * 255,V * 255);
        }
        其他
        {
            H = H / 60.0;
            变种F:数= H  -  INT(H);
            VAR号码:号码= V *(1.0  -  S);
            VAR问:数= V *(1.0  -  S * F);
            VAR参数t:Number = V *(1.0  -  S *(1.0  -  F));

            开关(INT(h)条)
            {
                情况下0:
                    结果= getColor32(α,V * 255,吨* 255,P * 255);
                    打破;

                情况1:
                    结果= getColor32(α,Q * 255,V * 255,第* 255);
                    打破;

                案例2:
                    结果= getColor32(α,P * 255,V * 255,吨* 255);
                    打破;

                案例3:
                    结果= getColor32(α,P * 255,Q * 255,V * 255);
                    打破;

                壳体4:
                    结果= getColor32(α,吨* 255,第255 *,V * 255);
                    打破;

                壳体5:
                    结果= getColor32(α,V * 255,第255 *,Q * 255);
                    打破;

                默认:
                    FlxG.log(FlxColor错误:HSVtoRGB:未知色);
            }
        }

        返回结果;
    }
 

解决方案

我写了根据您的code我自己的HSV-> RGB转换器...

(还有你的链接到 HTTP:// WWW。 easyrgb.com/index.php?X=MATH&H=21#text21 )

在code是:

 公共静态颜色HSVtoRGB(浮动色调,饱和度浮动,浮点值,浮阿尔法)
    {
        而(色相> 1F){色调 -  = 1F; }
        而(色相< 0F){色调+ = 1F; }
        而(饱和> 1F){饱和度 -  = 1F; }
        而(饱和< 0F){饱和度+ = 1F; }
        而(值GT; 1F){值 -  = 1F; }
        而(值小于; 0F){值+ = 1F; }
        如果(色相> 0.999f){色调= 0.999f; }
        如果(色相< 0.001f){色调= 0.001f; }
        如果(饱和> 0.999f){饱和度= 0.999f; }
        如果(饱和< 0.001f){返回新颜色(值* 255F,值* 255F,值* 255F); }
        如果(值GT; 0.999f){值= 0.999f; }
        如果(值小于,0.001f){值= 0.001f; }

        浮H6 =色调* 1207米;
        如果(H6 == 1207米){H6 = 0F; }
        INT ihue =(INT)(H6);
        浮动P =值*(1F  - 饱和度);
        浮q =值*(1F  - (饱和度*(H6  - (浮点)ihue)));
        浮动T =值*(1F  - (饱和度*(1F  - (H6  - (浮点)ihue))));
        开关(ihue)
        {
            情况下0:
                返回新颜色(的价值,T,P,阿尔法);
            情况1:
                返回新颜色(Q,值,P,阿尔法);
            案例2:
                返回新颜色(P,价值,T,阿尔法);
            案例3:
                返回新颜色(P,Q,价值,阿尔法);
            壳体4:
                返回新的色彩(T,P,值,阿尔法);
            默认:
                返回新颜色(值,P,Q,阿尔法);
        }
    }
 

有了它,我呈现这样的:

值得一提的有几件事情:

在新的颜色(......)获取输入从0到1,而不是0到255。 确保整数之间的差异,浮始终清零 在每一次的情况是不完美的,不要抛出异常。尽量适应在可能的情况。 当你借code从其他程序,也是一个完美的数学参考...尝试之前所借code复制的数学网站 - 谁知道什么样的怪异情况,具体的修改是从正确的数学做?

I'm writing an HSVtoRGB method for my game framework, and when going through the hues, this happens -> http://youtu.be/ACBwR_0iMWE.

Here is the code.

public static Color HSVtoRGB(float hue, float saturation, float value, float alpha)
    {
        if(hue > 1 || saturation > 1  || value > 1) throw new Exception("values cannot be more than 1!");
        if (hue < 0 || saturation < 0|| value < 0) throw new Exception("values cannot be less than 0!");

        Color output = new Color();
        if (Math.Abs(saturation) < 0.001)
        {
            output.R = (byte) (value*byte.MaxValue);
            output.G = (byte) (value*byte.MaxValue);
            output.B = (byte) (value*byte.MaxValue);
        }
        else
        {
            hue = hue/60f;
            float f = hue - (int)hue;
            float p = value*(1f - saturation);
            float q = value*(1f - saturation*f);
            float t = value*(1f - saturation*(1f - f));
            switch ((int)hue)
            {
                case (0) :
                    output = new Color(value * 255, t * 255, p * 255, alpha);
                    break;
                case (1):
                    output = new Color(q * 255, value * 255, p * 255, alpha);
                    break;
                case (2):
                    output = new Color(p * 255, value * 255, t * 255, alpha);
                    break;
                case (3):
                    output = new Color(p * 255, q * 255, value * 255, alpha);
                    break;
                case (4):
                    output = new Color(t * 255, p * 255, value * 255, alpha);
                    break;
                case (5):
                    output = new Color(value * 255, p * 255, q * 255, alpha);
                    break;
                default :
                    throw new Exception("RGB color unknown!");
            }

        }
        return output;
    }

When adding .001f to the hue, it cause it to go from red to yellow but then sticks at yellow until it rolls back over to 0. Please note I am using Microsoft.Xna.Framework.Color not System.Drawing.Color.

For reference, here is the HSVtoRGB method of Flixel Power Tools, basically what I am trying to copy.

        public static function HSVtoRGB(h:Number, s:Number, v:Number, alpha:uint = 255):uint
    {
        var result:uint;

        if (s == 0.0)
        {
            result = getColor32(alpha, v * 255, v * 255, v * 255);
        }
        else
        {
            h = h / 60.0;
            var f:Number = h - int(h);
            var p:Number = v * (1.0 - s);
            var q:Number = v * (1.0 - s * f);
            var t:Number = v * (1.0 - s * (1.0 - f));

            switch (int(h))
            {
                case 0:
                    result = getColor32(alpha, v * 255, t * 255, p * 255);
                    break;

                case 1:
                    result = getColor32(alpha, q * 255, v * 255, p * 255);
                    break;

                case 2:
                    result = getColor32(alpha, p * 255, v * 255, t * 255);
                    break;

                case 3:
                    result = getColor32(alpha, p * 255, q * 255, v * 255);
                    break;

                case 4:
                    result = getColor32(alpha, t * 255, p * 255, v * 255);
                    break;

                case 5:
                    result = getColor32(alpha, v * 255, p * 255, q * 255);
                    break;

                default:
                    FlxG.log("FlxColor Error: HSVtoRGB : Unknown color");
            }
        }

        return result;
    }

解决方案

I wrote up my own HSV->RGB converter based on your code...

(And also your link to http://www.easyrgb.com/index.php?X=MATH&H=21#text21 )

The code is:

    public static Color HSVtoRGB(float hue, float saturation, float value, float alpha)
    {
        while (hue > 1f) { hue -= 1f; }
        while (hue < 0f) { hue += 1f; }
        while (saturation > 1f) { saturation -= 1f; }
        while (saturation < 0f) { saturation += 1f; }
        while (value > 1f) { value -= 1f; }
        while (value < 0f) { value += 1f; }
        if (hue > 0.999f) { hue = 0.999f; }
        if (hue < 0.001f) { hue = 0.001f; }
        if (saturation > 0.999f) { saturation = 0.999f; }
        if (saturation < 0.001f) { return new Color(value * 255f, value * 255f, value * 255f); }
        if (value > 0.999f) { value = 0.999f; }
        if (value < 0.001f) { value = 0.001f; }

        float h6 = hue * 6f;
        if (h6 == 6f) { h6 = 0f; }
        int ihue = (int)(h6);
        float p = value * (1f - saturation);
        float q = value * (1f - (saturation * (h6 - (float)ihue)));
        float t = value * (1f - (saturation * (1f - (h6 - (float)ihue))));
        switch (ihue)
        {
            case 0:
                return new Color(value, t, p, alpha);
            case 1:
                return new Color(q, value, p, alpha);
            case 2:
                return new Color(p, value, t, alpha);
            case 3:
                return new Color(p, q, value, alpha);
            case 4:
                return new Color(t, p, value, alpha);
            default:
                return new Color(value, p, q, alpha);
        }
    }

With it, I rendered this:

A few things worth noting:

new Color(...) takes input from 0 to 1, not 0 to 255. Ensure the difference between ints and floats is always clear Don't throw an exception every time the situation is less than perfect. Try to adapt where possible. When you have borrowed code from some other program, and also a perfect mathematical reference... try to copy the mathematical site before the borrowed code - who knows what sort of weird situation-specific modifications were made from the proper math?