Entry tags:
К алгоритму раскраски слов
Для каждой буквы слова слева направо высчитать ее расстояния от R, G, B (C, M, Y, K) -- цвет буквы (как?) Эти цифры поделить на порядковый номер буквы в слове, умножить на поправочный коэффициент и прибавить к RGB слова.
RGB буквы можно высчитать из номера буквы, поделив все цветовое пространство на количество букв -- тогда каждой букве попадет свой цвет.
Негативный бэкграунд неплохо выходит по формуле (color + 0x777777) % 0xFFFFFF. Возможно, есть лучшие способы, но этот быстр и дает приемлемый результат.
Update: Не работает, и вот почему: нужно, чтобы последовательность прибавочных коэффициентов была строго убывающей. А она не. Потому что разница между коэффициентами для букв i и i+1 может быть гораздо больше, чем то, на что я их делю. То есть, вот такой вот скрипт:
не дает строго убывающей последовательности, если распечатывать для каждого слова $step, потому что разница между $letter_color{'0'} и $letter_color{'z'} слишком большая. Надо как-то привязаться к этой разнице, а как -- что-то не соображу.
RGB буквы можно высчитать из номера буквы, поделив все цветовое пространство на количество букв -- тогда каждой букве попадет свой цвет.
Негативный бэкграунд неплохо выходит по формуле (color + 0x777777) % 0xFFFFFF. Возможно, есть лучшие способы, но этот быстр и дает приемлемый результат.
Update: Не работает, и вот почему: нужно, чтобы последовательность прибавочных коэффициентов была строго убывающей. А она не. Потому что разница между коэффициентами для букв i и i+1 может быть гораздо больше, чем то, на что я их делю. То есть, вот такой вот скрипт:
my @letters = ('_', 'A' .. 'Z', 'a' .. 'z', '0' .. '9');
my $step = 0xFFFFFF / scalar(@letters);
my $start = 0;
my %letter_color = map({$_ => $start += $step} sort(@letters));
foreach (sort(@words))
{
my $word = $_;
my $wordcolor = 0;
for (my $i = 0; $i < length($word); $i++)
{
my $letter = substr($word, $i, 1);
my $color = ;
if (!defined($color))
{
print("Not found color for letter <$letter>!\n");
}
else
{
#Each next step should be smaller than the previous
my $step = $letter_color{$letter} / ($i + 1);
$wordcolor += $step;
}
}
}не дает строго убывающей последовательности, если распечатывать для каждого слова $step, потому что разница между $letter_color{'0'} и $letter_color{'z'} слишком большая. Надо как-то привязаться к этой разнице, а как -- что-то не соображу.

no subject
no subject
no subject
no subject
no subject
no subject
Я не о том. Числа вида NNNNNN при этом преобразовании дают красивый цикл:
0-777777-EEEEEE-666666-DDDDDD-555555-CCCCCC-444444-
BBBBBB-333333-AAAAAA-222222-999999-111111-888888
Только 0xFFFFFF->0x777777 выпадает.
no subject
(Anonymous) 2006-02-19 10:23 pm (UTC)(link)no subject
my @letters = ('_', 'A' .. 'Z', 'a' .. 'z', '0' .. '9'); my $step = 0xFFFFFF / scalar(@letters); my $start = 0; my %letter_color = map({$_ => $start += $step} sort(@letters)); foreach (sort(@words)) { my $word = $_; my $wordcolor = 0; for (my $i = 0; $i < length($word); $i++) { my $letter = substr($word, $i, 1); my $color = ; if (!defined($color)) { print("Not found color for letter <$letter>!\n"); } else { #Each next step should be smaller than the previous my $step = $letter_color{$letter} / ($i + 1); $wordcolor += $step; } } }не дает строго убывающей последовательности, если распечатывать для каждого слова $step, потому что разница между $letter_color{'0'} и $letter_color{'z'} слишком большая. Надо как-то привязаться к этой разнице, а как -- что-то не соображу.