sql >> Base de Datos >  >> RDS >> Mysql

ORDENAR POR Color con Hex Code como criterio en MySQL

Desea ordenar los códigos hexadecimales por longitud de onda, esto se asigna aproximadamente al valor del matiz. Dado un código hexadecimal como una cadena de seis caracteres:RRGGBB .

Solo necesita crear una función que tome una cadena de código hexadecimal y genere el valor de matiz, aquí está la fórmula de esta respuesta Math.SO :

R' =R/255

G' =G/255

B' =B/255

Cmax =max(R', G', B')

Cmin =min(R', G', B')

Δ =Cmáx - Cmín

Quería ver si esto funcionaría, así que preparé un programa de muestra en Ruby, muestra 200 colores aleatorios uniformemente del espacio RGB y los ordena, ¡la salida parece un arcoíris!

Aquí está la fuente de Ruby:

require 'paint'

def hex_to_rgb(hex)
  /(?<r>..)(?<g>..)(?<b>..)/ =~ hex
  [r,g,b].map {|cs| cs.to_i(16) }
end

def rgb_to_hue(r,g,b)
  # normalize r, g and b
  r_ = r / 255.0
  g_ = g / 255.0
  b_ = b / 255.0

  c_min = [r_,g_,b_].min
  c_max = [r_,g_,b_].max

  delta = (c_max - c_min).to_f

  # compute hue
  hue = 60 * ((g_ - b_)/delta % 6) if c_max == r_
  hue = 60 * ((b_ - r_)/delta + 2) if c_max == g_
  hue = 60 * ((r_ - g_)/delta + 4) if c_max == b_

  return hue
end

# sample uniformly at random from RGB space
colors = 200.times.map {  (0..255).to_a.sample(3).map { |i| i.to_s(16).rjust(2, '0')}.join   }

# sort by hue
colors.sort_by { |color| rgb_to_hue(*hex_to_rgb(color)) }.each do |color|
  puts Paint[color, color]
end

Tenga en cuenta que asegúrese de gem install paint para obtener la salida de texto en color.

Aquí está el resultado:

Debería ser relativamente sencillo escribir esto como una función SQL definida por el usuario y ORDER BY RGB_to_HUE(hex_color_code), sin embargo, mi conocimiento de SQL es bastante básico.

EDITAR:publiqué esta pregunta en dba.SE sobre la conversión de Ruby a una función definida por el usuario de SQL.