Вопрос об алгоритме: Должен динамично УВЕЛИЧИВАТЬ от 00FF00 до FF0000 со временем, C#/Java

Временные объекты автоматически удаляются через некоторое время (обычно 24 часа). Нет http API для их ручного удаления. Взгляните на скрипт /etc/cron.d/opencpu на вашем сервере.

Если вы действительно хотите удалить сеанс, вы можете вручную удалить каталог в /tmp/ocpu-store/ на вашем сервере. Он также автоматически удаляется при перезагрузке.

5
задан Svante 20 March 2009 в 22:48
поделиться

3 ответа

Просто думайте об этом с точки зрения компонентов. Даже при том, что это похоже на одно большое шестнадцатеричное число, это на самом деле три бок о бок.

В запуске, красном, 0, зеленый 255 (FF), синий 0.
В конце, красном, 255, зеленый 0, синий 0.

Так, каждый (количество времени Вы имеете / 255), увеличьте красный 1 и декрементный зеленый 1.

8
ответ дан 18 December 2019 в 05:21
поделиться

Если Вы идете от яркого цвета до яркого цвета, как шестнадцатеричные значения предполагают, то можно хотеть интерполировать в пространстве HSV, а не пространстве RGB. Пространство HSV приближается, как мы думаем о цвете - оттенок, насыщенность и значение. Пространство RGB приближается, как легкие чувствительные ячейки в наших глазах работают.

Верхний градиент является линейной интерполяцией RGB от FF0000 до 00FF00. Его среднее значение 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.

29
ответ дан 18 December 2019 в 05:21
поделиться

time_remaining (значение варьируется от 0 до 239),

зеленый = 255 * (time_remaining / 239)
красный = 255 - зеленый
синий = 0

окрасьте = (красный, зеленый, синий)

3
ответ дан 18 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: