Сортировка цветов (Objective-C) - PullRequest
10 голосов
/ 21 декабря 2011

Я делаю такие вещи:

- (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;
}

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

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

Ответы [ 2 ]

10 голосов
/ 21 декабря 2011

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

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 и затем выполните сортировку.

3 голосов
/ 21 декабря 2011

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

Проверьте вики для 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];
}
...