Bạn muốn sắp xếp mã hex theo bước sóng, điều này gần như ánh xạ vào giá trị màu. Đưa ra một mã hexcode dưới dạng một chuỗi sáu ký tự:RRGGBB
.
Bạn chỉ cần tạo một hàm nhận chuỗi hexcode và xuất ra giá trị màu, đây là công thức từ câu trả lời Math.SO này :
R '=R / 255
G '=G / 255
B '=B / 255
Cmax =max (R ', G', B ')
Cmin =min (R ', G', B ')
Δ =Cmax - Cmin
Tôi muốn xem điều này có hiệu quả không, vì vậy tôi đã tạo ra một chương trình mẫu trong Ruby, nó lấy mẫu 200 màu ngẫu nhiên đồng nhất từ không gian RGB và sắp xếp chúng, đầu ra trông giống như một cầu vồng!
Đây là nguồn 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
Lưu ý, hãy đảm bảo gem install paint
để nhận đầu ra văn bản màu.
Đây là kết quả:
Sẽ tương đối dễ hiểu khi viết đây là một hàm do người dùng SQL xác định và ĐẶT HÀNG BẰNG RGB_to_HUE (hex_color_code), tuy nhiên, kiến thức SQL của tôi khá cơ bản.
CHỈNH SỬA:Tôi đã đăng câu hỏi này trên dba.SE về việc chuyển đổi Ruby thành một hàm do người dùng SQL xác định.