Entry tags:
Будет сидеть! Я сказал!
Вдогонку
Безусловно, правильный алгоритм включает в себя вычисление по такой формуле (формулы напишу дома в OOO, на работе нечем, даже в здешнем M$ Wordе математика не установлена):
Проблема только в том, что для достаточно длинных (точнее сказать, сколько-нибудь интересной длины) слов $addition очень быстро сбегает к нулю. Видимо, нужно $index делить на некоторый коэффициент, поправочный.
update: Эксперименты показали, что прикольно, что очень неплохие значения дает коэффициент 2π. А еще лучше -- 1.5π. Разумного объяснения нету.
Update: Тут только такая проблема: если данные расположены несколькими достаточно удаленными друг от друга, но кучными блоками -- как это в моем случае и происходит. Тогда цвета получаются практически неразличимыми.
Тут надо, видимо, тесные интервалы искусственно раздвигать, а слишком большие искусственно же уменьшать. Надо только подумать, как это грамотно делать.
А вот как (ох, не крякнуть бы -- столько умища в такую пустяковую задачу вложено!) Берется некоторое значение $TOO_NARROW -- скажем, 5% всего диапазона значений. Все значения разделяются на блоки: между краями блоков разница больше, чем $TOO_NARROW, а внутри меньше. Потом весь диапазон значений делится на количество блоков, и блокам выдаются новые диапазоны значений -- не от минимума до максимума в блоке, а от нижнего края верхней трети проема, который снизу от блока, до верхнего края нижней трети проема, который сверху от него. Например, трети, на самом деле это тоже играбельное значение.
Безусловно, правильный алгоритм включает в себя вычисление по такой формуле (формулы напишу дома в OOO, на работе нечем, даже в здешнем M$ Wordе математика не установлена):
my @letters = sort('_', 'A' .. 'Z', 'a' .. 'z', '0' .. '9');
#Можно, конечно, пользоваться значениями самих букв в ASCII;
#может быть, это даже будет немножко легче --
#больше значения, заметнее разница.
my $index = 0;
my %letters = map({$_ =>
0xFFFFFF *
$index++}
@letters);
foreach my $word (sort(@words))
{
my $wordcolor = 0;
my $index = 0;
foreach my $letter (split(//, $word))
{
my $addition = $letters{$letter};
$addition /= scalar(@letters) ** ($index++);
$wordcolor += $addition ;
}
}Проблема только в том, что для достаточно длинных (точнее сказать, сколько-нибудь интересной длины) слов $addition очень быстро сбегает к нулю. Видимо, нужно $index делить на некоторый коэффициент, поправочный.
update: Эксперименты показали, что прикольно, что очень неплохие значения дает коэффициент 2π. А еще лучше -- 1.5π. Разумного объяснения нету.
Update: Тут только такая проблема: если данные расположены несколькими достаточно удаленными друг от друга, но кучными блоками -- как это в моем случае и происходит. Тогда цвета получаются практически неразличимыми.
Тут надо, видимо, тесные интервалы искусственно раздвигать, а слишком большие искусственно же уменьшать. Надо только подумать, как это грамотно делать.
А вот как (ох, не крякнуть бы -- столько умища в такую пустяковую задачу вложено!) Берется некоторое значение $TOO_NARROW -- скажем, 5% всего диапазона значений. Все значения разделяются на блоки: между краями блоков разница больше, чем $TOO_NARROW, а внутри меньше. Потом весь диапазон значений делится на количество блоков, и блокам выдаются новые диапазоны значений -- не от минимума до максимума в блоке, а от нижнего края верхней трети проема, который снизу от блока, до верхнего края нижней трети проема, который сверху от него. Например, трети, на самом деле это тоже играбельное значение.
