pechkin: (Default)
pechkin ([personal profile] pechkin) wrote2006-02-19 02:30 pm
Entry tags:

К алгоритму раскраски слов

Для каждой буквы слова слева направо высчитать ее расстояния от R, G, B (C, M, Y, K) -- цвет буквы (как?) Эти цифры поделить на порядковый номер буквы в слове, умножить на поправочный коэффициент и прибавить к RGB слова.

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

Post a comment in response:

If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting