AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题 / 79489801
Accepted
A_CE
A_CE
Asked: 2025-03-06 23:16:35 +0800 CST2025-03-06 23:16:35 +0800 CST 2025-03-06 23:16:35 +0800 CST

是否可以用代码创建表中的算法?

  • 772

下面是 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.."}")

带有最后编辑的代码输出的面板

代码浪费似乎还很多。有没有代码可以不使用表格,而是根据主表中的色调来实现这个算法?

lua
  • 1 1 个回答
  • 59 Views

1 个回答

  • Voted
  1. Best Answer
    Alexander Mashin
    2025-03-08T21:59:49+08:002025-03-08T21:59:49+08:00

    以下代码将调色板生成为二维 Lua 表:

    local abs, floor = math.abs, math.floor
    
    -- https://www.rapidtables.com/convert/color/hsv-to-rgb.html
    local function hsv2rgb (h, s, v)
        local c = s * v
        local x = c * (1 - abs ((h / 60) % 2 - 1))
        local m = v - c
        local cases = {
            { c, x, 0 }, -- h ∈ [0°; 60°)
            { x, c, 0 }, -- h ∈ [60°; 120°)
            { 0, c, x }, -- h ∈ [120°; 180°)
            { 0, x, c }, -- h ∈ [180°; 240°)
            { x, 0, c }, -- h ∈ [240°; 300°)
            { c, 0, x }  -- h ∈ [300°; 360°)
        }
        local rgb = {}
        for _, colour in ipairs (cases [floor (h / 60) + 1]) do
            rgb [#rgb + 1] = (colour + m) * 255
        end
        return rgb
    end
    
    local function palette (v_start, v_end, v_step, h_start, h_step)
        local h_steps = floor (360 / abs (h_step))
        local plt = {}
        -- Lower unsaturated half of the palette:
        for v = v_start, v_end, v_step do
            local gray = (v - v_start) / (v_end - v_start)
            local s = 1
            -- Excessive brightness reduces saturation:
            if v > 1 then
                s = s - (v - 1)
                v = 1
            end
            local row = {}
            for h = h_start, h_start + h_step * (h_steps - 1), h_step do
                row [#row + 1] = hsv2rgb (h % 360, s, v)
            end
            -- Grays:
            row [#row + 1] = hsv2rgb (0, 0, gray)
            plt [#plt + 1] = row
        end
        return plt
    end
    
    local as_linked = palette (0.2, 1.8, 0.2, 0, 30)
    local as_in_clrtbl = palette (0.2, 1.8, 0.2, 240, -30)
    
    

    其理念是,一列中的所有颜色都具有相同的色调;所有行都具有相同的亮度,当达到 100% 时,饱和度将开始降低。然后,颜色的 HSV 坐标通过 转换为 RGB hsv2rgb()。灰色列由特殊规则生成,亮度不断增加。

    palette()获取参数:

    • v_start — 顶行的亮度;在[0; 1]中,
    • v_end — 底行的亮度;在[0; 1]中,
    • v_step — 亮度增量;在(0, 1]中,
    • h_start — 第一列的色调;在 [0, 360) 中,0 表示红色,180 表示青色,
    • h_step — 色调增量;在(-360, 360)范围内,正数表示从红色变为紫色,负数表示从紫色变为红色。

    palette (0.2, 1.8, 0.2, 0, 30)将生成大致您所链接的表格。

    palette (0.2, 1.8, 0.2, 240, -30)将生成由 定义的表clrtbl。

    本页展示了生成的调色板的不同变体。单元格的背景是生成的颜色;圆圈的颜色是 的对应颜色clrtbl。左上角或右上角大致是 链接的颜色,左下角正好是clrtbl。

    • 0

相关问题

  • 如何在 neovim 中触发 lsp 建议弹出窗口?

  • Lua if 语句总是转到 else 选项

  • Lua脚本在按下几个键后执行命令

  • 如果表中有多个元素,如何在 Lua 中检查?

  • Lua脚本结束TCP连接?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve