我喜欢随机生成 - 和随机颜色 - 所以我决定将它们结合起来制作一个简单的 2d 景观生成器。我的想法是,根据方块的高度(是的,地形是由方块组成的)使其更亮或更暗,靠近顶部的东西更亮,靠近底部的东西更暗。我让它在灰度下工作,但正如我发现的那样,你不能真正使用基本的 RGB 颜色并使其更亮,因为 RGB 值之间的比率或任何类似的值似乎无法使用。解决方案?HSL。或者也许是 HSV,老实说我仍然不知道其中的区别。我指的是 H 0-360,S & V/L = 0-100。虽然...嗯,360 = 0,所以是 360 的值,但如果你真的有 0-100,那就是 101。真的是 0-359 和 1-100(或 0-99?),但是颜色选择编辑(目前指的是 GIMP...
无论如何,我找到了 HSL->RGB 转换的公式(here & here。据我所知,最终的公式是相同的,但我还是会提供代码(请注意,这是来自后面的 easyrgb.com 链接) :
Hue_2_RGB
float Hue_2_RGB(float v1, float v2, float vH) //Function Hue_2_RGB
{
if ( vH < 0 )
vH += 1;
if ( vH > 1 )
vH -= 1;
if ( ( 6 * vH ) < 1 )
return ( v1 + ( v2 - v1 ) * 6 * vH );
if ( ( 2 * vH ) < 1 )
return ( v2 );
if ( ( 3 * vH ) < 2 )
return ( v1 + ( v2 - v1 ) * ( ( 2 / 3 ) - vH ) * 6 );
return ( v1 );
}
和另一段代码:
float var_1 = 0, var_2 = 0;
if (saturation == 0) //HSL from 0 to 1
{
red = luminosity * 255; //RGB results from 0 to 255
green = luminosity * 255;
blue = luminosity * 255;
}
else
{
if ( luminosity < 0.5 )
var_2 = luminosity * (1 + saturation);
else
var_2 = (luminosity + saturation) - (saturation * luminosity);
var_1 = 2 * luminosity - var_2;
red = 255 * Hue_2_RGB(var_1, var_2, hue + ( 1 / 3 ) );
green = 255 * Hue_2_RGB( var_1, var_2, hue );
blue = 255 * Hue_2_RGB( var_1, var_2, hue - ( 1 / 3 ) );
}
抱歉,不确定修复这些空白的好方法。
我用我自己的名字、色调、饱和度和亮度替换了 H、S、L 值。我回头看了看,但除非我遗漏了什么,否则我会正确替换它。但是,除了 C++ 所需的部分之外,hue_2_RGB 函数完全未经编辑。(例如变量类型)。我也曾经对所有东西都有整数 - R、G、B、H、S、L - 然后我想到了...... HSL 是公式的浮点数 - 或者至少,它看起来应该是。所以我使用变量(var_1,var_2,所有的v,R,G,B,色调,饱和度,亮度)来浮动。所以我不相信这是某种数据丢失错误。此外,在输入公式之前,我有色相 /= 360、饱和度 /= 100 和亮度 /= 100。请注意,在此之前,我有色相 = 59、饱和度 = 100 和亮度 = 70。我相信我得到了色调正确为 360 以确保 0-1,
所以,我的问题是,为什么这个公式不起作用?谢谢,如果你能帮忙。
编辑:如果问题不清楚,请发表评论。