下面是 RGB 颜色代码表。
当我在带有 lua 代码的表单中使用此表时,我创建了一个 13*9 色调面板。是否可以创建一个代码,在不使用表格的情况下创建相同的算法(颜色代码)(或基于第一行 13 种颜色)?
local clrtbl = { 0x000033,0x001933,0x003333,0x003319,0x003300,0x193300,0x333300,0x331900,0x330000,0x330019,0x330033,0x190033,0x000000, 0x000066,0x003366,0x006666,0x006633,0x006600,0x336600,0x666600,0x663300,0x660000,0x660033,0x660066,0x330066,0x202020, 0x000099,0x004C99,0x009999,0x00994C,0x009900,0x4C9900,0x999900,0x994C00,0x990000,0x99004C,0x990099,0x4C0099,0x404040, 0x0000CC,0x0066CC,0x00CCCC,0x00CC66,0x00CC00,0x66CC00,0xCCCC00,0xCC6600,0xCC0000,0xCC0066,0xCC00CC,0x6600CC,0x606060, 0x0000FF,0x0080FF,0x00FFFF,0x00FF80,0x00FF00,0x80FF00,0xFFFF00,0xFF8000,0xFF0000,0xFF007F,0xFF00FF,0x7F00FF,0x808080, 0x3333FF,0x3399FF,0x33FFFF,0x33FF99,0x33FF33,0x99FF33,0xFFFF33,0xFF9933,0xFF3333,0xFF3399,0xFF33FF,0x9933FF,0xA0A0A0, 0x6666FF,0x66B2FF,0x66FFFF,0x66FFB2,0x66FF66,0xB2FF66,0xFFFF66,0xFFB266,0xFF6666,0xFF66B2,0xFF66FF,0xB266FF,0xC0C0C0, 0x9999FF,0x99CCFF,0x99FFFF,0x99FFCC,0x99FF99,0xCCFF99,0xFFFF99,0xFFCC99,0xFF9999,0xFF99CC,0xFF99FF,0xCC99FF,0xE0E0E0, 0xCCCCFF,0xCCE5FF,0xCCFFFF,0xCCFFE5,0xCCFFCC,0xE5FFCC,0xFFFFCC,0xFFE5CC,0xFFCCCC,0xFFCCE5,0xFFCCFF,0xE5CCFF,0xFFFFFF}
这个算法表从左到右创建了 13 种颜色,从上到下创建了 9 种色调。从这个角度考虑,它似乎以一定的对称性排列。最终的输出在图中清晰可见。我们该如何解决这个问题?
我在下面添加了一个计算代码。但它甚至与我的表格列表相差甚远。我的目标是制作一个使用 lua 代码生成相同算法(生成色调的 RGB 十六进制代码)的函数,而不使用表格。
编辑:我认为通过从表中取出两行(26种色调)可以得到最接近的结果如下:
local base_colors = {0x000033, 0x001933, 0x003333, 0x003319, 0x003300, 0x193300, 0x333300, 0x331900, 0x330000, 0x330019, 0x330033, 0x190033, 0x000000}
local special_colors = {0x0000FF, 0x0080FF, 0x00FFFF, 0x00FF80, 0x00FF00, 0x80FF00, 0xFFFF00, 0xFF8000, 0xFF0000, 0xFF007F, 0xFF00FF, 0x7F00FF, 0xFFFFFF}
local function calculate_shades(base_color)
local shades = {}
local step = 0x22
for i = 0, 7 do
local red = ((base_color // 0x10000) & 0xFF)
local green = ((base_color // 0x100) & 0xFF)
local blue = (base_color & 0xFF)
red = math.min(255, red + i * step)
green = math.min(255, green + i * step)
blue = math.min(255, blue + i * step)
local shade = (red << 16) + (green << 8) + blue
shades[#shades + 1] = shade
end
table.insert(shades, base_color)
return shades
end
local function generate_color_table(base_colors, special_colors)
local color_table = {}
local special_index = 1
for base_index, base_color in ipairs(base_colors) do
local shades = calculate_shades(base_color)
for shade_index, shade in ipairs(shades) do
if (base_index - 1) * 9 + shade_index == special_index * 9 then
table.insert(color_table, special_colors[special_index])
special_index = special_index + 1
else
table.insert(color_table, shade)
end
end
end
return color_table
end
local result = "newClrTbl = {"
local color_table = generate_color_table(base_colors, special_colors)
for i = 1, #color_table do
if i == #color_table then
result = result .. (string.format("0x%06X", color_table[i]))
else
result = result .. (string.format("0x%06X,", color_table[i]))
end
end
print(result.."}")
代码浪费似乎还很多。有没有代码可以不使用表格,而是根据主表中的色调来实现这个算法?