2011-03-25 9 views
8

¿Cuál es la forma más rápida/más fácil de ordenar los colores en System.Media.Colors de acuerdo con su posición en el espectro visible (rojo a azul o azul a rojo doesn ' t importa)?Ordenar System.Media.Colors según la posición en el espectro visible

EDIT:

Aquí está el resultado de la ordenación (hue-> de la saturación> brillo):

enter image description here

Ésta es probablemente técnicamente correcto pero visualmente que todavía no lo es. ¿Alguien puede arrojar luz sobre cuál es el problema?

+0

Es imposible representar un espacio tridimensional (color) continuamente en una secuencia unidimensional. ¿Qué estás tratando de lograr exactamente? –

+0

Bien, gracias. Eso es exactamente lo que necesitaba saber. Pensé lo contrario. – NVM

Respuesta

4

Parece que desea ordenar los colores por matiz. Para hacer eso, necesita calcular el tono de un color, y la estructura Wpf System.Media.Color no incluye propiedades para hacer eso por usted.

Tienes dos opciones:

  • puede calcular manualmente la tonalidad. Esto no es realmente difícil, pero es complicado: muchas declaraciones de si ... entonces. Código de ejemplo que hace esto can be found on devx. Esto es más trabajo y menos legible, pero probablemente la opción más rápida.
  • Puede usar System.Drawing.Color.GetHue. La estructura de color más antigua de winforms-era System.Drawing admite computación del tono. Eso hace que el código sea realmente simple; algo como System.Drawing.Color.FromArgb(col.R, col.G, col.B).GetHue() será suficiente, ¡agradable y corto! Sin embargo, significa que tratará con dos estructuras con nombres idénticos y, por supuesto, necesitará referenciar el ensamblaje System.Drawing.dll. Este tipo de métodos tienden a ser lentos y hacen muchas comprobaciones de cordura, por lo que si el rendimiento es crítico, es probable que sea menos atractivo.

El espacio de color es tridimensional. Aunque puede ordenar en una dirección (como el tono, aquí), la secuencia de colores resultante solo aparecerá continua si mantiene constantes las otras dos direcciones (saturación y brillo en el modelo HSB). Es por eso que la mayoría de los recolectores de color eligen una representación bidimensional, pero incluso así, debes dejar una dimensión constante dentro de un selector de color dado para mantener un gradiente continuo.

+0

Agregaré que él puede "simplemente" tomar prestado el código de GetHue del Mono y crear un método de extensión. El único problema de lo que está haciendo es que está ordenando una columna calculada (sí, es una optimización prematura). – xanatos

+0

Bueno, esto funciona pero no completamente. 'Desmarcándolo' como una respuesta. – NVM

+0

Bueno, esto responde mi pregunta. ¡Aunque estaba intentando algo imposible! – NVM

Cuestiones relacionadas