当前位置:  开发笔记 > 编程语言 > 正文

算法问题:需要在TIME,C#/ Java上从00FF00到FF0000动态递增

如何解决《算法问题:需要在TIME,C#/Java上从00FF00到FF0000动态递增》经验,为你挑选了2个好方法。

我希望随着时间的推移(240小时)将亮绿色变为深红色.我能看到的最好方法是将十六进制组合从00FF00更改为FF0000.

我不知道如何从00FF00动态计数到FF0000.我正在寻找10天的时间,所以最有可能超过240小时来增加.

谁能帮我吗?

我从来没有参加算法课程,所以我认为这可能与这个问题有关.

如果您有更好的方法,请告诉我.

我在这里寻找某种代码.多谢你们.它可以是任何语言,但不可避免地会转换为C#.



1> Pete Kirkham..:

如果您从十六进制值建议的亮色到亮色,那么您可能希望在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的立方体螺旋颜色插值所示.



2> Chad Birch..:

只要从组件方面考虑一下.即使它看起来像一个大十六进制数,它实际上是三个并排.

在开始时,红色为0,绿色为255(FF),蓝色为0.
最后,红色为255,绿色为0,蓝色为0.

所以,每一个(你有多少时间/ 255),将红色增加1并将绿色减1.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有