Есть ли какие-либо метод в какао, который помогает итерацию через все значения NScolor (R, G, B только, альфа не тронута)?
Вопрос
Мне нужна функция, которая для данного R, g, значения B возвращает следующий цвет.
По словам следующего цвета, я имею в виду цвет, который один из компонентов изменяется на 1 (предполагая, что значения R, G, B диапазон 0-255).
Это должно быть построено таким образом, что начиная с белого цвета (или черного альтернативы), вы можете соблюдать все цвета (количество которых 255 * 255 * 255). Было бы неплохо, но не требуется, чтобы после итерации во всех тонах они повторяются с самого начала.
Решение
Вы можете основывать цветное извлечение на Цветные списки, либо используя пользовательский или Apple, как "Веб безопасные цвета":
NSColorList* cl = [NSColorList colorListNamed:@"Web Safe Colors"];
NSLog(@"%@", cl);
for (NSString *key in [cl allKeys]) {
NSLog(@" * %@ - %@", key, [cl colorWithKey:key]);
}
Если вам нужно больше, и заказ не имеет значения, вы можете использовать, например, +colorWithColorSpace:components:count:
:
uint32_t c = 0;
// increment c whenever a color is requested ...
CGFloat components[4] = {
((c & 0xFF0000) >> 16) / 256.0,
((c & 0x00FF00) >> 8 ) / 256.0,
((c & 0x0000FF) >> 0 ) / 256.0,
0.0
};
NSColor *color = [NSColor colorWithColorSpace:[NSColorSpace genericRGBColorSpace]
components:components
count:4];
Другие советы
Неясно, что вы имеете в виду с «следующим цветом», но вы можете легко иметь счетчик, с которого вы извлекаете компоненты:
uint32 color = 0;
uint8 r = color%256;
uint8 g = (color/256) % 256;
uint8 b = (color/(256*256)) % 256;
// use color
++color;
в противном случае вы можете просто генерировать случайные цвета и отслеживать уже использованные с помощью NSSet
. Отказ Конечно, вы собираетесь упаковать 3 компонента в один объект, как int
.