我有一个类似于 500*500 值的二维位图数组。我正在尝试在数组上创建线性渐变,因此生成的位图看起来像这样(灰度):
(来源:showandtell-graphics.com)
输入将是要填充的数组、两个点(例如 Photoshop/GIMP 中渐变工具的起点和终点)以及将使用的值范围。
我目前最好的成绩是这样的:
alt text http://img222.imageshack.us/img222/1733/gradientfe3.png
...这与我想要实现的目标相去甚远。它看起来更像是径向渐变。
创建这种渐变的最简单方法是什么?我打算用 C++ 实现它,但我想要一些通用算法。
最佳答案
这确实是一个数学问题,因此它是否真的“属于”Stack Overflow 可能值得商榷,但无论如何:您需要将图像中每个点的坐标投影到渐变轴上并使用该坐标来确定颜色。
在数学上,我的意思是:
- 假设您的起点是 (x1, y1),终点是 (x2, y2)
- 计算
A = (x2 - x1)
和B = (y2 - y1)
- 计算
C1 = A * x1 + B * y1
起点和C2 = A * x2 + B * y2
对于终点(C2
应该大于C1
) - 对于图像中的每个点,计算
C = A * x + B * y
如果
C <= C1
, 使用起始颜色;如果C >= C2
, 使用结束颜色;否则,使用加权平均值:(start_color * (C2 - C) + end_color * (C - C1))/(C2 - C1)
我做了一些快速测试来检查这是否基本有效。
关于c++ - 在二维数组中创建线性渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521493/