在2D数组中创建线性渐变

Mat*_*ský 5 c++ algorithm graphics

我有一个类似2D位图的数组,比方说500*500的值.我正在尝试在数组上创建线性渐变,因此生成的位图看起来像这样(灰度): 示例渐变
(来源:showandtell-graphics.com)

输入将是要填充的数组,两个点(如Photoshop/GIMP中渐变工具的起点和终点)以及将使用的值范围.

我目前最好的结果是:

alt text http://img222.imageshack.us/img222/1733/gradientfe3.png

......这远远不是我想要实现的目标.它看起来更像是径向渐变.

创建这样一个渐变的最简单方法是什么?我将用C++实现它,但我想要一些通用算法.

Dav*_*d Z 14

这实际上是一个数学问题,所以它是否真的"属于"Stack Overflow可能是有争议的,但无论如何:你需要将图像中每个点的坐标投影到渐变的轴上,并使用该坐标来确定颜色.

在数学上,我的意思是:

  1. 假设您的起点是(x1,y1),结束点是(x2,y2)
  2. 计算A = (x2 - x1)B = (y2 - y1)
  3. 计算C1 = A * x1 + B * y1起点和C2 = A * x2 + B * y2终点(C2应大于C1)
  4. 对于图像中的每个点,计算 C = A * x + B * y
  5. 如果C <= C1,使用起始颜色; 如果C >= C2,使用结束颜色; 否则,使用加权平均值:

    (start_color * (C2 - C) + end_color * (C - C1))/(C2 - C1)

我做了一些快速测试来检查这基本上是否有效.

  • +1,什么是编程,如果不应用数学?=) (3认同)

Dan*_*ane 3

在您的示例图像中,看起来您有一个径向渐变。这是我对您所需步骤的即兴数学解释。抱歉数学问题,其他答案在实施方面更好。

  1. 定义一个线性函数(如 y = x + 1),其域(即 x)从您想要开始的颜色到您想要结束的颜色。您可以将其视为 Ox0 到 OxFFFFFF 之间的范围(对于 24 位颜色)。如果你想处理亮度之类的东西,你必须对范围(即 y 值)做一些技巧。
  2. 接下来,您需要在已有的矩阵上映射一个向量,因为这定义了颜色变化的方向。此外,线性函数定义的颜色值将分配在向量上的每个点上。向量的起点和终点还定义了 1 中域的最小值和最大值。您可以将向量视为渐变的一条线。
  3. 对于矩阵中的每个单元格,可以根据单元格垂直线与向量相交处的向量为颜色分配一个值。请参见下图,其中 c 是单元格的位置, 。是交点。如果你假装颜色在。是红色,那么这就是您要分配给单元格的内容。
             |
             C
             |
             |
    向量:____.______________
             |
             |