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'} слишком большая. Надо как-то привязаться к этой разнице, а как -- что-то не соображу.
