2011-12-21 2 views
10

я делаю такого рода вещи:Сортировка цветов (Objective-C)

- (NSArray*)colors { 
    float divisor = .3333; 
    NSMutableArray *retVal = [NSMutableArray array]; 
    for (float one=0; one <= 1.0f; one += divisor) { 
     for (float two = 0; two <= 1.0f; two += divisor) { 
      for (float three = 0; three <= 1.0f; three += divisor) { 
       UIColor *color = [UIColor colorWithRed:one green:two blue:three alpha:.5]; 
       // also bad 
       // UIColor *color = [UIColor colorWithHue:one saturation:two brightness:three alpha:.5]; 
       [retVal addObject:color]; 
      } 
     } 
    } 
    return retVal; 
} 

и, как я подозревал, цвета выходят ужасно из строя (для глаз). Красные не с красными, пурпурные не с пурпурами и т. Д.

Нет ли простого способа создать список разнообразных цветов, хорошо сгруппированных в соответствии с человеческими критериями типа «это выглядит синим?».

+1

Нет, вы должны ответить на этот вопрос :) – kennytm

+0

Сделал это, спасибо @KennyTM. –

ответ

10

Это сработало довольно хорошо. Это НЕ поможет в том, что у вас много повторяющихся цветов. Смотрите ниже:

NSArray *sorted = [[dict allValues] sortedArrayUsingComparator:^NSComparisonResult(UIColor* obj1, UIColor* obj2) { 
    float hue, saturation, brightness, alpha; 
    [obj1 getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]; 
    float hue2, saturation2, brightness2, alpha2; 
    [obj2 getHue:&hue2 saturation:&saturation2 brightness:&brightness2 alpha:&alpha2]; 
    if (hue < hue2) 
     return NSOrderedAscending; 
    else if (hue > hue2) 
     return NSOrderedDescending; 

    if (saturation < saturation2) 
     return NSOrderedAscending; 
    else if (saturation > saturation2) 
     return NSOrderedDescending; 

    if (brightness < brightness2) 
     return NSOrderedAscending; 
    else if (brightness > brightness2) 
     return NSOrderedDescending; 

    return NSOrderedSame; 
}]; 

Вы можете получить доступ компонентов (HSBA), как это в IOS 4.x:

CGFloat *components = (CGFloat *)CGColorGetComponents([color CGColor]); 
    float hue = components[0]; 
    float saturation = components[1]; // etc. etc. 

Чтобы избежать повторения цвета: вы можете поместить элементы в NSMutableDictionary , на которые накладывается что-то вроде яркости насыщенности оттенков (каждый округляется до ближайшего .10) ... затем вы получаете массив от THAT, а затем сортируете.

+0

Значения 'float' должны быть' double', иначе он дает ошибку 'EXC_BAD_ACCESS'. – aykutt

3

Я думаю, используя [UIColor colorWithHue: насыщенность: яркость: альфа:] - ваш лучший выбор. Если вы исправите насыщенность, яркость и альфа и просто используете Hue, вы получите все цвета в порядке.

Отъезд the wiki for HSB для получения дополнительной информации.

for (float hsb = 0; hsb <= 1.0f; hsb += divisor) { 
      UIColor *color = [UIColor colorWithHue:hsb saturation:1.0f brightness:1.0f alpha:.5f]; 
      [retVal addObject:color]; 
} 
+0

Если вы посмотрите на информацию о цвете hsb, вам понадобится только один цикл, чтобы получить полный спектр цветов. – thelaws

+0

Ничего себе, если вы пройдете через насыщения на внешней петле, вы получите связную вещь. Ницца! +1 –

Смежные вопросы