我希望随着时间的推移(240小时)将亮绿色变为深红色.我能看到的最好方法是将十六进制组合从00FF00更改为FF0000.
我不知道如何从00FF00动态计数到FF0000.我正在寻找10天的时间,所以最有可能超过240小时来增加.
谁能帮我吗?
我从来没有参加算法课程,所以我认为这可能与这个问题有关.
如果您有更好的方法,请告诉我.
我在这里寻找某种代码.多谢你们.它可以是任何语言,但不可避免地会转换为C#.
如果您从十六进制值建议的亮色到亮色,那么您可能希望在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 ); }
我不相信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; }
您可能希望找到矢量与RGB立方体边缘的交集,而不是简单地将其夹紧,但在这种情况下,无论哪种方式都无关紧要.
作为附录,也值得考虑HSY空间,它更接近于感知亮度,如Dave Green的立方体螺旋颜色插值所示.
只要从组件方面考虑一下.即使它看起来像一个大十六进制数,它实际上是三个并排.
在开始时,红色为0,绿色为255(FF),蓝色为0.
最后,红色为255,绿色为0,蓝色为0.
所以,每一个(你有多少时间/ 255),将红色增加1并将绿色减1.