2010-05-30 4 views
0

Мне нужна функция, которая для заданных значений R, G, B возвращает следующий цвет.Есть ли какой-либо метод в какао, который помогает выполнять итерацию по всем значениям NSColor (только R, G, B, альфа не трогается)?

Говоря следующий цвет, я имею в виду цвет, который один из компонентов изменяется на 1 (при условии, что значения R, G, B имеют диапазон 0-255).

Он должен быть сконструирован таким образом, что начиная с белого цвета (или черного цвета) вы можете перебирать все цвета (количество которых составляет 255 * 255 * 255). Было бы неплохо, но не требовалось, чтобы после повторения всех цветов они повторялись с самого начала.

+4

Я отчасти смущен вашей постановки задачи ... как ваши ответы до сих пор, кажется разумным, но вы говорите, ни правильно. Возможно, вы должны немного перефразировать свой вопрос - возможно, опишем пример. –

ответ

1

Вы могли извлечение основного цвета на color lists, либо с помощью пользовательского или Apple, один, как «Web Safe Colors»:

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]; 
+0

Это будет работать, если в любой цветовой палитре было много цветов. Мне нужно как минимум 1 мил, а палитры - не более 200. – krasnyk

+0

@krasnyk: см. Обновление - интересно, однако, если они визуально различимы. –

1

Это не ясно, что вы имеете в виду с «следующим цветом», но вы можете легко иметь счетчик, из которого вы извлечь компоненты:

uint32 color = 0; 

uint8 r = color%256; 
uint8 g = (color/256) % 256; 
uint8 b = (color/(256*256)) % 256; 

// use color 

++color; 

в противном случае вы можете просто генерировать случайные цвета и отслеживаете уже используются с NSSet. Конечно, вы собираетесь упаковать 3 компонента в один объект, например int.

+0

Меня не интересует случайный цвет. Мне нужно: общий цвет, который мы можем получить, составляет 255 * 255 * 255> 16 мил. То, что я хотел бы получить, это любой из 16-мильных цветов (например, повторить его - порядок цветов не важен - я не хочу, чтобы цвета повторялись до тех пор, пока я не достиг 16-миллиметровой). – krasnyk

+0

Джек, это должно быть 'unsigned' или' uint32_t' для 'b', чтобы иметь полезные значения. –

+0

Это правда, спасибо. – Jack