16進コードを波長でソートする場合、これは大まかに色相値にマッピングされます。 6文字の文字列として16進コードを指定します:RRGGBB
。
16進コード文字列を受け取り、色相値を出力する関数を作成する必要があります。式は次のとおりです。このMath.SOの回答から :
R'=R / 255
G'=G / 255
B'=B / 255
Cmax =max(R'、G'、B')
Cmin =min(R'、G'、B')
Δ=Cmax-Cmin
これが機能するかどうかを確認したかったので、Rubyでサンプルプログラムを作成し、RGB空間から200のランダムな色を均一にサンプリングして並べ替えると、出力は虹のようになります。
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ユーザー定義関数およびORDERBYRGB_to_HUE(hex_color_code)として記述するのは比較的簡単ですが、私のSQLの知識はかなり基本的です。
編集:この質問をdba.SEに投稿しました RubyをSQLユーザー定義関数に変換する方法について。