C# HSV至RGB停在黄色C处#
我正在为我的游戏框架编写一个HSVtoRGB方法,在使用色调时,会发生-> 这是代码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!");
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之间的差异始终清晰
- 不要每次情况不太完美时都抛出异常。尽可能地适应
- 当你从其他程序中借用了代码,同时也是一个完美的数学参考。。。试着在借用代码之前复制数学站点-谁知道从正确的数学中做出了哪种奇怪的情况特定的修改
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之间的差异始终清晰
- 不要每次情况不太完美时都抛出异常。尽可能地适应
- 当你从其他程序中借用了代码,同时也是一个完美的数学参考。。。试着在借用代码之前复制数学站点-谁知道从正确的数学中做出了哪种奇怪的情况特定的修改