2009-08-28 2 views
2

Я хочу написать функцию в рубине, которая задает число от 1 до 500, выдаст шестизначный шестицветный код, который становится более темным для более высоких чисел. Это не так сложно, но я не уверен, с чего начать. Как я могу это реализовать?Линейно увеличивая алгоритм цветовой темноты

редактировать

Hue кажется более надежным способом пойти. Я хотел бы дать контрольный цвет, например, оттенок зеленого, а затем затемнить или осветлить его на основе входного номера.

вход: 10
выход: код цвета (в RGB или HSV), который представляет собой легкий оттенок опорного цвета

ввод: 400
выход: код цвета (в RGB или HSV), который является довольно темный оттенок эталонного цвета

редактировать 2

Единственная причина, мне нужно использовать от 1 до 500, потому что это вход я должен работать. Все в порядке, если некоторые цифры, близкие друг к другу, соответствуют одному и тому же цвету.

+0

Не знаете, что именно вы спрашиваете. Можете ли вы привести пример ввода и вывода образца? –

+0

Доступно только 256 уровней яркости для шкалы серого. например 0x000000, 0x010101 ... 0xfefefe, oxffffff, поэтому 500 кажется немного бессмысленным. Если вы хотите изменить оттенок, например. перейти от светло-голубого к темно-красному, есть еще несколько шагов, но вам нужно будет уточнить вашу проблему немного больше. – ScottS

+0

Хотите ли вы сделать контрольный цвет постепенно темнее, или вы будете довольны прогрессией от белого до черного? – peejaybee

ответ

2

Базовая линейная интерполяция?

// Pseudocode 
function fade_colour(source, factor) 
    const max = 500 
    const min = 1 

    foreach component in source 
     output[component] = round(source[component] * (max - value)/(max - min)) 
    endforeach 

    return output 
endfunction 
+0

@ Рэнсом, ты уверен? Если я ввожу значение = 1, я получаю исходный [компонент] назад, согласно Google, и если я ввожу значение = 500, я получаю 0. – strager

+0

Извините, я не знаю, что я думал - ваша формула точно такая же, как у меня , только более общий. Я снимаю свой комментарий. –

1

Почему бы просто не вернуть уровень серого, а затем #ffffff на # 000000? 500 уровней темноты на самом деле не различимы, а серые дают вам 256 уровней.

+1

Спасибо, но мне нужно использовать контрольный цвет. Грейс не будет работать для меня. – Anon

+1

просто разделите число 1 на 500 на 2, и вы получите от 1 до 250, что, вероятно, идеально подходит для вас.(фактическая математика: nuval = oldval * 255/500 - с ints, обязательно размножайтесь перед делением) –

3

6-значный шестицветный код цвета находится в RGB. Вы хотите работать в HSV: выберите оттенок и насыщенность и постепенно уменьшайте значение. Конвертировать из HSV в RGB для вывода цвета. См. Пример here.

+0

другие ссылки: http://en.wikipedia.org/wiki/HSL_and_HSV –

+0

Это выглядит хорошо. Есть простой способ конвертировать из HSV в RGB в Ruby? – Anon

+0

@William - Да, ссылка Википедии от Джареда Апдайка показывает простую формулу. Все, что вам нужно, это пол, мода и арифметика. – mbeckish

1

Если вы хотите только затемнить свой контрольный цвет, это легко. Учитывая цвет R, G, B, который является самым ярким, вы хотите увеличить, умножьте каждое из трех значений на (500-input) и разделите на 499. Преобразуйте каждое из значений в 2 шестнадцатеричных цифры и добавьте их с помощью # на перед.

+0

, как указано в другом месте, это не так, как работает цвет RGB. HSV - лучшая цветовая система для этого. –

+0

Я не уверен, что понимаю это возражение. Есть и другие операции, которые могут быть проще в другом цветовом пространстве, но потемнение RGB-цвета довольно тривиально. –

Смежные вопросы