Spo*_*com 5 algorithm hex colors
我希望随着时间的推移(240小时)将亮绿色变为深红色.我能看到的最好方法是将十六进制组合从00FF00更改为FF0000.
我不知道如何从00FF00动态计数到FF0000.我正在寻找10天的时间,所以最有可能超过240小时来增加.
谁能帮我吗?
我从来没有参加算法课程,所以我认为这可能与这个问题有关.
如果您有更好的方法,请告诉我.
我在这里寻找某种代码.多谢你们.它可以是任何语言,但不可避免地会转换为C#.
Pet*_*ham 29
如果您从十六进制值建议的亮色到亮色,那么您可能希望在HSV空间而不是RGB空间中进行插值.HSV空间近似于我们如何考虑色彩 - 色调,饱和度和价值.RGB空间近似于我们眼睛中的光敏细胞如何工作.
上部梯度是从FF0000到00FF00的线性RGB插值.它的中间值是7f7f00,是一种泥泞的棕色.
中间梯度是HSV空间中的线性插值.由于FF0000和00FF00都是完全饱和且具有相同的值(亮度),因此插值始终保持相同的亮度和饱和度,因此中心值为亮黄色ffff00.
第三种选择是RGB空间中的矢量旋转,这意味着中间值是B4B400,(B4十六进制= 180十进制= 255/sqrt(2)),它介于两种效果之间.这是通过计算每个终点的大小,然后缩放RGB线性插值的结果以使其具有相同的幅度来完成的,有效地在两种颜色和原点的平面中以弧形扫描矢量.因为我们实际上并没有对亮度进行相同的不同颜色称重,或者看起来是线性的,所以它并不精确,但它在扫描时确实具有相当均匀的强度,而HSV在中间稍微轻一些,因为它有两个值100%.
删除死了Imageshack链接
在Java中,你有HSB支持,算法很简单 - 得到最终值的HSB,线性插入它们与其他RGB答案一样,然后转换创建一个颜色与h,s,v值:
static Color hsvInterpolate ( float mix, Color c0, Color c1 ) {
float[] hsv0 = new float[3];
float[] hsv1 = new float[3];
float alt = 1.0f - mix;
Color.RGBtoHSB( c0.getRed(), c0.getGreen(), c0.getBlue(), hsv0 );
Color.RGBtoHSB( c1.getRed(), c1.getGreen(), c1.getBlue(), hsv1 );
float h = mix * hsv0 [ 0 ] + alt * hsv1 [ 0 ];
float s = mix * hsv0 [ 1 ] + alt * hsv1 [ 1 ];
float v = mix * hsv0 [ 2 ] + alt * hsv1 [ 2 ];
return Color.getHSBColor ( h, s, v );
}
Run Code Online (Sandbox Code Playgroud)
我不相信C#内置了转换,因此代码实际上并没有太多用处.
static Color vectorInterpolate ( float mix, Color c0, Color c1 ) {
float alt = 1.0f - mix;
double x0 = c0.getRed();
double y0 = c0.getGreen();
double z0 = c0.getBlue();
double x1 = c1.getRed();
double y1 = c1.getGreen();
double z1 = c1.getBlue();
double mag0 = sqrt( x0*x0 + y0*y0 + z0*z0 );
double mag1 = sqrt( x1*x1 + y1*y1 + z1*z1 );
double x = mix * x0 + alt * x1;
double y = mix * y0 + alt * y1;
double z = mix * z0 + alt * z1;
double mag = mix * mag0 + alt * mag1;
double scale = mag / sqrt( x*x + y*y + z*z );
return new Color (
clamp ( x * scale ),
clamp ( y * scale ),
clamp ( z * scale ) );
}
static int clamp ( double value ) {
int x = (int) round ( value );
if ( x > 255 ) return 255;
if ( x < 0 ) return 0;
return x;
}
Run Code Online (Sandbox Code Playgroud)
您可能希望找到矢量与RGB立方体边缘的交集,而不是简单地将其夹紧,但在这种情况下,无论哪种方式都无关紧要.
作为附录,也值得考虑HSY空间,它更接近于感知亮度,如Dave Green的立方体螺旋颜色插值所示.
只要从组件方面考虑一下.即使它看起来像一个大十六进制数,它实际上是三个并排.
在开始时,红色为0,绿色为255(FF),蓝色为0.
最后,红色为255,绿色为0,蓝色为0.
所以,每一个(你有多少时间/ 255),将红色增加1并将绿色减1.
归档时间: |
|
查看次数: |
3796 次 |
最近记录: |