Некоторое время я думал о том, чтобы создать как можно больше (в определенных пределах) цветов для столько цветов, сколько необходимо. Дополнительным хлопотом является то, что если мне понадобится дополнительная пара цветов позже для того же графика (возможно, будет добавлена пара дополнительных полос), они должны вписаться в ту же схему, сохраняя существующие цвета одинаковыми.
Идея, которую я придумала, - обманчивый трюк. Представьте круг цветов (возможно, каждый из них имеет разные оттенки с одинаковой насыщенностью и яркостью, хотя вы можете определить любой круг в любом цветовом пространстве). Вместо того, чтобы давать угол в градусах для этого круга, установите диапазон от нуля до 255. В двоичном виде это от 00000000 до 11111111. Добавьте единицу к 8-битному 255, и он переполнится обратно в ноль, так что он естественным образом действует как «круговое значение» (в технических терминах сложение и вычитание по модулю 256).
Хитрость заключается в том, что вы выбираете цвет ноль, цвет один и т. Д., Чтобы инвертировать эти цифры. Чтобы сделать это в C, я бы использовал ...
value = ((value & 0x0F) << 4) | ((value & 0xF0) >> 4);
value = ((value & 0x33) << 2) | ((value & 0xCC) >> 2);
value = ((value & 0x55) << 1) | ((value & 0xAA) >> 1);
Таким образом, последовательность 0, 1, 2, 3, 4 преобразуется в 0, 128, 64, 192, 32.
Дело в том, что у вас есть 256 различных цветов, и самые ранние из них очень широко разнесены, а более поздние становятся менее разнесенными и заполняют пробелы (64 - это половина от 0 до 128, 32 - это половина от 0 до 64 и т. д.).
Любая ширина в битах для определенного «угла» будет работать, если вы адаптируете инверсию битов, и, конечно, вы можете запустить несколько циклов одновременно для разных параметров цвета (возможно, оттенок вращается быстро, но насыщение вращается медленнее).
Это оставляет только вопрос о том, как вы сопоставляете свои «углы» с определенными числами RGB или чем-то еще, в чем я не эксперт - о, и вопрос о том, поддерживает ли ActionScript битовую привязку.