c++ - 在二维数组中创建线性渐变

标签 c++ algorithm graphics

我有一个类似于 500*500 值的二维位图数组。我正在尝试在数组上创建线性渐变,因此生成的位图看起来像这样(灰度): Example gradient
(来源:showandtell-graphics.com)

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

我目前最好的成绩是这样的:

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

...这与我想要实现的目标相去甚远。它看起来更像是径向渐变。

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

最佳答案

这确实是一个数学问题,因此它是否真的“属于”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)

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

关于c++ - 在二维数组中创建线性渐变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/521493/

相关文章:

java - LibGDX/Java - 尝试找到从一个对象到另一个对象的 vector

r - 将箱线图转换为 R 中 ggplot2 中的密度

c++ - 文件处理:What is the use of peek() function in c++?

c++ - boost assign list_of 不适用于双文字?

Python套接字未从C++ Boost asio接收所有数据

algorithm - 给定一个平衡的 BST。 a min, max, and value,如何找到min和max中最大的Xor?

c++ - 为 C 数学函数调用 MSVC 内置/内在函数

python - 如何编辑 A* 寻路算法以仅查找直线移动?

algorithm - 适用于旅行商的 Harmony Search 算法

opengl - GLSL abs() 坏了?