Искате да сортирате шестнадесетични кодове по дължина на вълната, това приблизително съответства на стойността на нюанса. Даден е шестнадесетичен код като низ от шест знака:RRGGBB
.
Просто трябва да направите функция, която приема низ от шестнадесетичен код и извежда стойността на нюанса, ето формулата от този Math.SO отговор :
R' =R/255
G' =G/255
B' =B/255
Cmax =max(R', G', B')
Cmin =min(R', G', B')
Δ =Cmax - Cmin
Исках да видя дали това ще работи, затова създадох примерна програма в Ruby, тя взема проби от 200 произволни цвята равномерно от RGB пространството и ги сортира, изходът изглежда като дъга!
Ето източника на 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
Забележка, не забравяйте да gem install paint
за да получите цветния текст.
Ето изхода:
Би трябвало да е сравнително лесно да напиша това като SQL функция, дефинирана от потребителя и ORDER BY RGB_to_HUE(hex_color_code), но познанията ми за SQL са доста основни.
РЕДАКТИРАНЕ:Публикувах този въпрос в dba.SE относно преобразуването на Ruby в SQL дефинирана от потребителя функция.