2010-07-28 10 views
8

Estoy tratando de obtener un color aleatorio. Lo he hecho uso de la fuerza bruta, pero este método parece excesivamente laboriosa (aunque la distribución es muy parejo):getRandomColor pero evita los colores oscuros: ayuda a mi algoritmo

- (UIColor *) getRandomColor { 
// GOAL: reject colors that are too dark 
float total = 3; 
float one = arc4random() % 256/256.0; 
total -= one; 
float two = arc4random() % 256/256.0; 
total -= two; 
float three = total; // UIColor will chop out-of-range nums 

NSMutableArray *threeFloats = [[[NSMutableArray alloc] initWithObjects:[NSNumber numberWithFloat:one], [NSNumber numberWithFloat:two], [NSNumber numberWithFloat:three], nil] autorelease]; 

NSNumber *red, *green, *blue; 
red = [threeFloats objectAtIndex:arc4random() % [threeFloats count]]; 
[threeFloats removeObject:red]; 
green = [threeFloats objectAtIndex:arc4random() % [threeFloats count]]; 
[threeFloats removeObject:green]; 
blue = [threeFloats lastObject]; 

return [UIColor colorWithRed:[red floatValue] green:[green floatValue] blue:[blue floatValue] alpha:1]; 
} 

¿Cómo puede ser mejor? Quiero una distribución uniforme de rojo, verde y azul y nada demasiado oscuro (de lo contrario, tomaría tres números aleatorios y terminaré con eso).

Respuesta

15
+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha; 

CGFloat hue = (arc4random() % 256/256.0); // 0.0 to 1.0 
CGFloat saturation = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from white 
CGFloat brightness = (arc4random() % 128/256.0) + 0.5; // 0.5 to 1.0, away from black 

Si el blanco está bien, haga la saturación como hue en lugar de brillo.

1

Este método podría ayudar a generar rápidamente los colores brillantes al azar:

1 - Pick a random integer between 0-2 
2 - If it is 0, set Red to Random(0.75-1.0), Green and Blue to Random(0.0-1.0) 
2 - If it is 1, set Green to Random(0.75-1.0), Red and Blue to Random(0.0-1.0) 
2 - If it is 2, set Blue to Random(0.75-1.0), Green and Red to Random(0.0-1.0) 
2

probablemente me genero (pseudo) números aleatorios para el tono, saturación y luminosidad (o HSB), con la ligereza (o el brillo) limitado a cualquier rango que encuentre razonable, entonces convert that to RGB.

Cuestiones relacionadas