Модуль:Colour (Bk;rl,&Colour)
Перейти к навигации
Перейти к поиску
Документация
Этому модулю не хватает документации. |
-- Просто попытка использовать Луа
-- Практическая ценность минимальна (хотя функция hsv_to_rgb может кому пригодится?)
local p = {}
-- оттенок от 0 до 360
function p.hsv_to_rgb(hue_input, saturation, value)
local hue = hue_input % 360
local chroma = saturation * value
local h = hue / 60
local x = (1 - math.abs(h % 2 - 1)) * chroma
local r, g, b = 0, 0, 0
if h < 1 then
r, g = chroma, x
elseif h < 2 then
r, g = x, chroma
elseif h < 3 then
g, b = chroma, x
elseif h < 4 then
g, b = x, chroma
elseif h < 5 then
r, b = x, chroma
else
r, b = chroma, x
end
m = value - chroma
return r+m, g+m, b+m
end
function p.rgb_to_css(r, g, b)
return 'rgb(' .. math.ceil(r*255) .. ',' .. math.ceil(g*255) .. ',' .. math.ceil(b*255) .. ')'
end
function p.hsv_to_css(h, s, v)
local r, g, b = p.hsv_to_rgb(h, s, v)
return p.rgb_to_css(r, g, b)
end
function p.rainbow(frame)
local s = frame.args[1]
local r = ''
local l = mw.ustring.len(s)
local i = 0
for v in mw.ustring.gmatch(s, '.') do
r = r .. '<span style="color: ' .. p.hsv_to_css(i * 360 / l, 1, 0.7) .. ';">' .. v .. '</span>'
i = i + 1
end
return r
end
-- определяем цвет по числу
function p.map_number_to_color_css_args(number, raised_to, minnum, maxnum, s, v)
-- получаем значение от 0 до 1
-- TODO: убедиться, что maxnum ≠ minnum
local h = (number - minnum) / (maxnum - minnum)
if h < 0 then
h = 0
end
if h >= 1 then
h = 1
end
-- теперь возьмём цвет
return p.hsv_to_css(math.pow(h, raised_to) * 400 - 40, s, v)
end
function p.map_number_to_color_css(frame)
return p.map_number_to_color_css_args(
tonumber(frame.args[1]), tonumber(frame.args[2]),
tonumber(frame.args[3]), tonumber(frame.args[4]),
tonumber(frame.args[5]), tonumber(frame.args[6])
)
end
return p