C# HSV至RGB停在黄色C处#

C# HSV至RGB停在黄色C处#,c#,.net,colors,xna,C#,.net,Colors,Xna,我正在为我的游戏框架编写一个HSVtoRGB方法,在使用色调时,会发生-> 这是代码 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!");

我正在为我的游戏框架编写一个HSVtoRGB方法,在使用色调时,会发生->

这是代码

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

在方法开始时,色调限制为0.0f。。1.0f 然后将其除以60华氏度,因此现在处于0.0华氏度的范围内。。1/60.0f

然后打开(int)色调,该色调将始终为零


我认为交换机的其他分支永远不会执行。

在方法的开头,色调被限制为0.0f。。1.0f 然后将其除以60华氏度,因此现在处于0.0华氏度的范围内。。1/60.0f

然后打开(int)色调,该色调将始终为零


我认为交换机的其他分支永远不会执行。

我根据您的代码编写了自己的HSV->RGB转换器

(以及您的链接)

代码是:

    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);
        }
    }
公共静态颜色HSVtoRGB(浮动色调、浮动饱和度、浮动值、浮动alpha)
{
而(色调>1f){hue-=1f;}
而(色调<0f){hue+=1f;}
而(饱和度>1f){saturation-=1f;}
而(饱和度<0f){saturation+=1f;}
而(值>1f){value-=1f;}
而(值<0f){value+=1f;}
如果(色调>0.999f){hue=0.999f;}
如果(色调<0.001f){色调=0.001f;}
如果(饱和度>0.999f){饱和度=0.999f;}
如果(饱和度<0.001f){返回新颜色(值*255f,值*255f,值*255f);}
如果(值>0.999f){value=0.999f;}
如果(值<0.001f){value=0.001f;}
浮动h6=色调*6f;
如果(h6==6f){h6=0f;}
int ihue=(int)(h6);
浮点p=值*(1f-饱和);
浮点数q=值*(1f-(饱和*(h6-(浮点数)ihue));
浮动t=值*(1f-(饱和*(1f-(h6-(浮动)ihue));
交换机(ihue)
{
案例0:
返回新颜色(值、t、p、alpha);
案例1:
返回新颜色(q、值、p、alpha);
案例2:
返回新颜色(p,值,t,alpha);
案例3:
返回新颜色(p、q、值、alpha);
案例4:
返回新颜色(t、p、值、alpha);
违约:
返回新颜色(值、p、q、alpha);
}
}
有了它,我呈现了以下内容:

有几件事值得注意:

  • 新颜色(…)将输入从0到1,而不是从0到255
  • 确保int和float之间的差异始终清晰
  • 不要每次情况不太完美时都抛出异常。尽可能地适应
  • 当你从其他程序中借用了代码,同时也是一个完美的数学参考。。。试着在借用代码之前复制数学站点-谁知道从正确的数学中做出了哪种奇怪的情况特定的修改

我根据您的代码编写了自己的HSV->RGB转换器

(以及您的链接)

代码是:

    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);
        }
    }
公共静态颜色HSVtoRGB(浮动色调、浮动饱和度、浮动值、浮动alpha)
{
而(色调>1f){hue-=1f;}
而(色调<0f){hue+=1f;}
而(饱和度>1f){saturation-=1f;}
而(饱和度<0f){saturation+=1f;}
而(值>1f){value-=1f;}
而(值<0f){value+=1f;}
如果(色调>0.999f){hue=0.999f;}
如果(色调<0.001f){色调=0.001f;}
如果(饱和度>0.999f){饱和度=0.999f;}
如果(饱和度<0.001f){返回新颜色(值*255f,值*255f,值*255f);}
如果(值>0.999f){value=0.999f;}
如果(值<0.001f){value=0.001f;}
浮动h6=色调*6f;
如果(h6==6f){h6=0f;}
int ihue=(int)(h6);
浮点p=值*(1f-饱和);
浮点数q=值*(1f-(饱和*(h6-(浮点数)ihue));
浮动t=值*(1f-(饱和*(1f-(h6-(浮动)ihue));
交换机(ihue)
{
案例0:
返回新颜色(值、t、p、alpha);
案例1:
返回新颜色(q、值、p、alpha);
案例2:
返回新颜色(p,值,t,alpha);
案例3:
返回新颜色(p、q、值、alpha);
案例4:
返回新颜色(t、p、值、alpha);
违约:
返回新颜色(值、p、q、alpha);
}
}
有了它,我呈现了以下内容:

有几件事值得注意:

  • 新颜色(…)将输入从0到1,而不是从0到255
  • 确保int和float之间的差异始终清晰
  • 不要每次情况不太完美时都抛出异常。尽可能地适应
  • 当你从其他程序中借用了代码,同时也是一个完美的数学参考。。。试着在借用代码之前复制数学站点-谁知道从正确的数学中做出了哪种奇怪的情况特定的修改

这就是Flixel电动工具公司的员工如何使用HSLtoRGB方法。老实说,我不太确定这件事到底是怎么回事(我试着像这篇文章那样做,但根本不起作用。使用这种方法,它至少可以通过红色->黄色没有问题。我用我复制的HSVtoRGB方法更新了这个问题。他们没有更新,但是,我不确定我应该做什么。每个HSV-RGB方法都是这样工作的……如果你乘以6而不是divid到了60岁,它就应该可以工作了。我试着一字不差地复制EasyRGB方式,但仍然不起作用。在我看来,这是最好的方法->这就是Flixel电动工具公司的人如何使用他们的HSLtoRGB方法。老实说,我不太确定这东西到底是如何工作的(我试着像这篇文章那样做,但根本不起作用