¿Cómo pintar un buen map de color RGB?

Estoy intentando pintar un map de color RGB completo que eventualmente permitirá a un usuario seleccionar un color tocando ese map visual en cualquier punto. Mi código actual es el siguiente:

- (void)drawRect:(CGRect)rect { CGContextRef c = UIGraphicsGetCurrentContext(); for (float x=0; x<320; x++) { for (float y=0; y<416; y++) { float r = x / 320; float g = y / 416; float b = (y < 208) ? y / 208 : (416 - y) / 208; CGContextSetRGBFillColor(c, r, g, b, 1.0); CGContextFillRect(c, CGRectMake(x, y, 1, 1)); } } } 

El resultado no está tan mal, pero aún no estoy satisfecho. El espectro pierde colors shinys, incluido el blanco. La razón es clara: rojo, verde y azul nunca alcanzarán 1.0 al mismo time.

Captura de pantalla del mapa de colores resultante

¿Tiene algún consejo sobre cómo mejorar ese map para que represente el espectro completo del espacio de color RGB?

¡Gracias por todas sus aportaciones!

ACTUALIZAR:

Como lo sugirió Josh Caswell , he usado el espacio de color HSB y el siguiente código:

 - (void)drawRect:(CGRect)rect { CGContextRef c = UIGraphicsGetCurrentContext(); int size = 20; for (float x=0; x<320; x+=size) { float s = x < 160 ? 1 : (320 - x) / 160; float b = x < 160 ? x / 160 : 1; for (float y=0; y<416; y+=size) { float h = y / 416; [[UIColor colorWithHue:h saturation:s brightness:b alpha:1.0] setFill]; CGContextFillRect(c, CGRectMake(x, y, size, size)); } } } 

Esto da como resultado la siguiente salida que es perfecta para mis necesidades.

Resultado usando el espacio de color HSB

Gracias por todos los comentarios.

Bueno, estás tratando de aplanar un object tridimensional en un avión. Un color RGB básicamente representa un punto dentro de un cubo. Mapear el sólido RGB en una superficie puede ser matemáticamente posible, pero probablemente no sea particularmente intuitivo para este propósito de selección de color.

Puede tener mejor suerte con HSB, que se parece más a un cilindro con tono como ángulo alnetworkingedor de la circunferencia. Podría "desenrollar" el cilindro, correlacionar tonalidad con la coorderada y, luego variar el brillo o la saturación a lo largo del eje x; puede hacer algunas testings simples para decidir qué componente es más importante para su aplicación. Se podría usar un golpe de dos dedos para el tercer componente si considerara necesario includelo.

HSB con saturación en el eje X:
Mapa HSB; S en el eje X

Con brillo en el eje X:
Mapa HSB; B en el eje X

Con la saturación y el brillo iguales y ambos en el eje X:
Mapa HSB; S = B en el eje X

Si necesita blanco, que ocurre cuando S = 0%, B = 100%, puede pegar una tira a un lado o probar S = 1 / B.

Creo que una forma de derivarlo es tal:

Horizontalmente, para cada píxel, elija una relación de rgb tal como "0, 0, 1"

Dibuja píxeles de arriba a abajo con un "brillo" que va de 0 a 1.

Derive cada píxel como pixel = brightness * (r,g,b)

A medida que avanza horizontalmente, se itera RGB como:

000, 001, 010, 011, 100, 101, 110, 111

Puede lograr esto usando una ecuación y manejar su interpolación al mismo time, si usa 3 cálculos de seno.

Esto resuelve su problema de blanco y negro, y le brinda una gran cantidad de espacio de color. Si necesita absolutamente cada píxel del espacio de color, debe hacer su interpolación horizontal de forma diferente y necesitará 2 ^ 8 en lugar de 8 puntos de control.

Estás intentando representar un espacio de color tridimensional en una superficie bidimensional. Es poco probable que encuentre una sola superficie que sea adecuada.

Necesitará una selección de dos partes.