Rol*_*ien 6 language-agnostic colors
我的应用程序包含一个可以一次显示20个或更多数据集的折线图,但通常它会显示少于5.我希望每个数据集都有一个独特的颜色.
目前我这样做:
setHsl(i * 255.0 / session->getNumDataSets(), 255, 128);
Run Code Online (Sandbox Code Playgroud)
它有效,但缺点是两个连续的数据集将具有非常相似的颜色.我希望它能使生成的每种颜色尽可能地与之前生成的所有颜色形成对比.
什么是产生颜色的更好方法?
这是我的第二次尝试:
double pos = 0;
if (wheel.size() == 0)
{
wheel.append(0.0);
wheel.append(1.0);
}
else
{
double gap = 0;
double hi = 0;
double lo = 0;
for (int i = 0; i < wheel.size() - 1; i++)
{
double g = wheel[i + 1] - wheel[i];
if (g > gap)
{
gap = g;
lo = wheel[i];
hi = wheel[i + 1];
}
}
pos = (hi - lo) / 2.0 + lo;
wheel.append(pos);
qSort(wheel);
}
QColor c;
c.setHsl(pos * 255.0, 255, 128);
return c.toRgb();
Run Code Online (Sandbox Code Playgroud)
我的想法是第一种颜色,是色轮上的位置0.然后对于每一种颜色,我绕着色轮,寻找颜色之间的最大差距,一旦我找到它,我就在这个间隙中插入一种新颜色.它似乎工作得更好,但仍然不完美,因为一旦间隙变小,连续的颜色再次变得相似.
你可以这样做:
int n = session->getNumDataSets();
setHsl( (((i%3) * n/3)+(i/3)) * 255.0 / n, 255, 128);
Run Code Online (Sandbox Code Playgroud)
我必须仔细检查我的数学,但基本上它会旋转三分之一的频谱。