sql >> Databáze >  >> RDS >> Mysql

ORDER BY Color s Hex kódem jako kritériem v MySQL

Chcete-li třídit hexadecimální kódy podle vlnové délky, to se zhruba mapuje na hodnotu odstínu. Zadán hexadecimální kód jako řetězec šesti znaků:RRGGBB .

Stačí vytvořit funkci, která vezme řetězec hexkódu a vydá hodnotu odstínu, zde je vzorec z této odpovědi Math.SO :

R' =R/255

G' =G/255

B' =B/255

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

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

A =Cmax - Cmin

Chtěl jsem zjistit, jestli to bude fungovat, a tak jsem vytvořil vzorový program v Ruby, který vzorkuje 200 náhodných barev jednotně z prostoru RGB a třídí je, výstup vypadá jako duha!

Zde je zdroj 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

Nezapomeňte gem install paint získáte barevný textový výstup.

Zde je výstup:

Mělo by být relativně jednoduché napsat to jako uživatelsky definovanou funkci SQL a ORDER BY RGB_to_HUE(hex_color_code), nicméně moje znalosti SQL jsou docela základní.

EDIT:tuto otázku jsem zveřejnil na dba.SE o převodu Ruby na uživatelem definovanou funkci SQL.



  1. MySQL + Query vrátí všechny řádky, které mají sloupce, které jsou 'aktivní' v jiné tabulce

  2. Minimální protokolování s INSERT…SELECT a Fast Load Context

  3. Heslo salt -- Dělám to správně?

  4. Konverze data MySQL