c++ - 以编程方式确保随机调色板充满活力并且与背景截然不同

标签 c++ qt user-interface colors

好的,我有一个 Qt GUI 应用程序,我决定在其中随机生成调色板(允许我根据数据的唯一 ID 区分显示的数据)。

我使用的算法是这样的:

void Palette::generatePalette(quint32 seed, bool dark) {
    sfmt_t sfmt;
    sfmt_init_gen_rand(&sfmt, seed);
    quint32 i;
    qreal hue;
    QColor col;

    qreal lightness = 0.75;
    qreal saturation = 0.6;

    if (dark) {
        lightness = 0.5;
        saturation = 0.8;
    }

    for (i = 0; i < numberOfColors; i++) {
        hue = sfmt_genrand_res53(&sfmt);
        hue += 0.618033988749895;
        hue = fmod(hue, 1.0);
        col = QColor::fromHslF(hue, saturation, lightness);
        palette.append(col);
    }
}

在大多数情况下,这给了我漂亮的柔和色彩,在灰色背景下非常明显。但是,偶尔会出现黄色,很难与背景区分开来。

我想知道的是,是否可以通过编程方式将背景颜色与生成的颜色进行比较,如果太难以区分,则丢弃并重新生成颜色。

我在谷歌上四处寻找答案,但找不到。我通常也不是 GUI 程序员,所以我不经常以这种方式处理颜色。

最佳答案

有几个color distance/difference methods .

对于您的应用程序(因为您不需要很高的准确性),您可以使用 Euclidean distance (或颜色度量空间中的另一个规范),如果此距离低于阈值,您将丢弃颜色。

double colorRGBEuclideanDistance(const QColor& c1, const QColor& c2)
{
    return sqrt(pow(c1.red()-c2.red(), 2) +
                pow(c1.green()-c2.green(), 2) +
                pow(c1.blue()-c2.blue(), 2));
}

关于c++ - 以编程方式确保随机调色板充满活力并且与背景截然不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14237702/

相关文章:

c++ - 试图计算一个字符串

qt - QML:如何在 QML 中销毁或停止工作脚本

vb.net - 将 VB.Net 桌面应用程序转换为移动 Web 应用程序的最快方法?

qt - 将信号连接到 QMetaProperty 的插槽

javascript - 如何设计 react 选择组件的箭头样式?

JavaFX 颜色选择器表格单元格中的自定义颜色

c++ - 有没有办法在 Linux 上将文本输出到不同颜色的文件?

c++ - 无法编译 OpenGL Superbible 7th 示例(未解析的外部符号)

字符串的 C++ vector 、指向函数的指针以及由此产生的挫败感

c++ - 在 QT 中运行有延迟的函数