c++ 如何在Qt中获得N个不同的类光谱颜色,起始颜色为红色,结束颜色为蓝色

rn0zuynd  于 2022-12-05  发布在  其他
关注(0)|答案(1)|浏览(164)

最初,我认为使用一个带有预先计算步长的for循环可以很容易地实现它。

// blue = (240, 255, 255)
// red  = (0,   255, 255)
const int step = (240 - 0) / (N - 1);
QColor color;
for (int i = 0; i < N; ++i)
{
  color.setHsv(i * step, 255, 255);
}

但是随着N变大,结束颜色可能不是我所期望的,例如(N == 82),结束颜色是hsv(162,255,255)而不是hsv(240,255,255)。
我的意图是1)产生N种不同的颜色,2)光谱状,3)以红色开始,以蓝色结束。我的要求是否也要考虑S,V?

2hh7jdfx

2hh7jdfx1#

现在,您选择一个整数步长,并将其相加以从最小值到最大值。这样做的优点是使色调均匀分布。但正如您所观察到的,它的缺点是有时会导致范围错误(可能会严重错误)。
如果您愿意牺牲一点色调间距,使其完全均匀,以更接近于填充指定范围,则可以将步长计算为浮点数,执行浮点乘法,然后进行舍入(或截断)。

std::vector<int> interpolate_range(int lower, int upper, int step_count) { 
    double step = (upper - lower) / (step_count - 1.0);

    std::vector<int> ret;
    for (int i=0; i<step_count; i++) {
        // step is a double, so `double * i` is done in floating
        // point, then the result is truncated to be pushed into
        // ret.
        ret.push_back(step * i);
    }
    return ret;
}

跳过其他颜色分量,只打印出这些值,我们得到:

0   2   5   8   11  14  17  20  23  26  

29  32  35  38  41  44  47  50  53  56  

59  62  65  68  71  74  77  80  82  85  

88  91  94  97  100 103 106 109 112 115 

118 121 124 127 130 133 136 139 142 145 

148 151 154 157 160 162 165 168 171 174 

177 180 183 186 189 192 195 198 201 204 

207 210 213 216 219 222 225 228 231 234 

237 240

如您所见,我们通常得到的间隔为3,但有几次(0至2、80至82和160至162)仅为2,因此我们可以填充整个范围。

相关问题