Anda ingin mengurutkan kode hex berdasarkan panjang gelombang, ini secara kasar memetakan ke nilai rona. Diberikan kode hex sebagai string enam karakter:RRGGBB
.
Anda hanya perlu membuat fungsi yang mengambil string hexcode dan mengeluarkan nilai hue, berikut rumusnya dari jawaban Math.SO ini :
R' =R/255
G' =G/255
B' =B/255
Cmaks =maks(R', G', B')
Cmin =min(R', G', B')
=Cmax - Cmin
Saya ingin melihat apakah ini akan berhasil, jadi saya membuat contoh program di Ruby, mengambil sampel 200 warna acak secara seragam dari ruang RGB, dan mengurutkannya, hasilnya terlihat seperti pelangi!
Ini sumber 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
Catatan, pastikan untuk gem install paint
untuk mendapatkan output teks berwarna.
Berikut outputnya:
Seharusnya relatif mudah untuk menulis ini sebagai fungsi yang ditentukan pengguna SQL dan ORDER BY RGB_to_HUE(hex_color_code), namun, pengetahuan SQL saya cukup mendasar.
EDIT:Saya memposting pertanyaan ini di dba.SE tentang mengonversi Ruby ke fungsi yang ditentukan pengguna SQL.