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

时间:2013-01-09 14:42:19

标签: 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程序员,所以我不经常以这种方式使用颜色。

1 个答案:

答案 0 :(得分:1)

有几个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));
}