C语言 在RGB上连续迭代

pftdvrlh  于 2023-03-01  发布在  其他
关注(0)|答案(4)|浏览(101)

我尝试迭代RGB值,得到一个连续的色板。通常,迭代3个值并得到它们,你可以像在二进制中那样做:

r g b 
0 0 0 
0 0 1
0 1 0

但我有一个主要问题。我们需要让他们的顺序看起来连续,所以例如,我去了红色,而不是正确的橙子,而不是黄色,绿色等。
什么算法,或伪代码,我应该使用,让他们在该顺序??
请参见随附的图片,颜色应该是什么样子:

5lwkijsr

5lwkijsr1#

从25500开始,然后向上计数g到2552550,然后向下计数红色到02550,然后向上计数蓝色到0255255,然后向下计数绿色到00255,然后向上计数红色到2550255,然后向下计数蓝色到25500。

sg24os4d

sg24os4d2#

从HSB或HSL值开始,然后将其转换为RGB。
选择亮度(B)和饱和度(S)时,通过连续更改色相(H)的值可以获得所需的效果
如果你谷歌一下,你会发现公式做转换

jaql4c8m

jaql4c8m3#

你所需要的是颜色的线性插值,以使从一种颜色到另一种颜色的平滑过渡。我会给你一个简单的锻炼,以了解所涉及的数学。
红色=(1,0,0)
黄色=(1,1,0)(正好位于红色和黄色之间)
绿色=(0,1,0)
首先从红色到黄色进行插值。由于xz保持不变,因此唯一需要插值的分量是y。平滑度取决于从一个极端到另一个极端的停靠次数。假设停靠次数= 4

+------------+------------+
|Red         |(1, 0, 0)   |
+------------+------------+
|            |(1, 0.2, 0) |
+            +------------+
|            |(1, 0.4, 0) |
+  Yellowish +------------+
|     Red    |(1, 0.6, 0) |
+            +------------+
|            |(1, 0.8, 0) |
+------------+------------+
|Yellow      |(1, 1, 0)   |
+------------+------------+
|            |(0.8, 1, 0) |
+            +------------+
|            |(0.6, 1, 0) |
+ Yellowish  +------------+
|   Green    |(0.4, 1, 0) |
+            +------------+
|            |(0.2, 1, 0) |
+------------+------------+
|Green       |(0, 1, 0)   |
+------------+------------+

如果你从Red -> Yellow -> Green -> Cyan -> Blue -> Magenta插值,你会得到一条线,一个极端是红色,另一个极端是洋红色。
现在,要创建您在问题中发布的HSV wheel,需要同时执行径向和轴向插值。

  • 色调 *(或实际颜色)是径向插值,即基于Angular 。这里的平滑度(停止)将基于Angular 而不是距离。
+-------+-------+
|Angle° |Colour |
+-------+-------+
|0/360  |Red    |
+-------+-------+
|60     |Yellow |
+-------+-------+
|120    |Green  |
+-------+-------+
|180    |Cyan   |
+-------+-------+
|240    |Blue   |
+-------+-------+
|300    |Magenta|
+-------+-------+
  • 饱和度 *(鲜艳度)是径向插值的,即基于点到中心的距离。中心是纯白的,而周围的点是纯色的。

所以从圆心到圆周的0 °角连线的圆心是白色的(1,1,1),圆周是纯红色的(1,0,0),其他Angular 也是这样(直到你回到360/0 °),你就得到了你贴的轮子;它实际上是一个更大的(HSV)圆柱体的圆盘,其垂直轴将插入 * 亮度 *(图片在维基百科的优秀文章链接以上)。
有关HSV控制盘的实时渲染,请参见下面的代码。
一个二个一个一个

woobm2wo

woobm2wo4#

使用HSV而不是RGB可以使在色轮上迭代变得非常简单,只需使用H值(色调)从0到360循环即可。
HSV是RGB的另一种颜色表示法,RGB代表“色调、饱和度、明度"(或HSL / HSB中的无光/亮度)。使用HSB执行大多数颜色操作要简单得多,因为所有颜色都在色谱上按色调(H)排序
色相单位是色轮上的度数,如参考图像所示。色相从0开始,一直到360,两者都是红色。红色之后,色相60是黄色。色轮在色相300、洋红色之后结束。

相关问题