Qt:如何创建一个二维插值颜色场?

3

我对c++和图形相关的东西是个初学者。

我想为我的graphicsview制作一个动态背景,类似于这样:

Gradient Field Airflow

这张图片代表了物体上空气流动的湍流现象。颜色必须基于一个数值矩阵。

我只能找到如何使用QT进行单向渐变的方法。

我该如何设置?如何获得双向渐变?

/*编辑 很好地指出了技术上讲这不是一个渐变,而是在2D节点数组上进行的颜色插值。 */


你所描述的与图形框架中所指的“渐变”无关。你想要做的是在一个二维节点数组上插值。 - Kuba hasn't forgotten Monica
是的,那正是我想做的,我会编辑我的帖子。 你有任何关于如何做到这一点的想法吗? - JerichoJosh
2个回答

1

好的,由于您没有提供输入数据,因此没有人知道您实际想要实现什么!

如果你有流线轨迹和质量,那么可以使用一些粒子系统和重度模糊/平滑滤波来实现。对于沿轨迹的任何已知点,绘制一个带有颜色的抖动圆圈,颜色取决于质量/温度/速度...和颜色比例尺。它应该在中间是实心的,在边缘是透明的。渲染后只需多次模糊/平滑图像即可。使用的点越少,圆圈就必须越大才能很好地覆盖区域,也可以分多个步骤进行,并随机更改点的坐标以提高图像的随机性...
如果你有场强度/速度/温度或其他网格值,那么与 #1 类似,你也可以通过 QUADs/正方形进行渲染。2D线性渐变称为双线性过滤。

其中:

  • c00,c01,c10,c11 是角落颜色
  • c(x,y) 是正方形内 x,y 位置上的颜色
  • x,y 范围为 <0,1>,为了简单起见(但可以使用适当的等式缩放任何范围)

双线性插值3 倍线性插值

        c0=c(x,0)=c00+((c01-c00)*x)
        c1=c(x,1)=c10+((c11-c10)*x)
        c(x,y)   =c0 +((c1 -c0 )*y)

所以使用上述计算出的颜色来渲染正方形的所有像素,这就是你要寻找的内容。这种过滤通常会在正方形之间的边缘或对角线上产生伪影,为了避免这种情况,可以使用非线性过滤或模糊/平滑最终图像。

1

Qt 中有一个关于渐变的教程:http://qt-project.org/doc/qt-4.8/demos-gradients.html,以及一个类:http://harmattan-dev.nokia.com/docs/library/html/qt4/qgradient.html。我从未使用过除线性渐变之外的其他渐变类型,根据文档,Qt 中似乎只有三种基本类型的渐变可用:线性、径向和圆锥形。如果您无法使用这三种类型组合出所需的渐变,则恐怕需要自己编写图像像素程序。不要忘记,探索一下 OpenGL 是否能够提供帮助也许是值得的。Qt 有一些使用 OpenGL 的类,但我不熟悉它们,无法提供更多建议。


嗯,你提到的这些渐变色已经是我正在尝试使用的了。我的问题是如何实现它们以获得所需的结果。 - JerichoJosh
好的,从你的问题中并不清楚你已经尝试了哪些选项。如果你需要实现自定义渐变,我建议看一下 QImage,它可以访问单个像素,然后你可以实现你的数学算法来进行颜色插值。你可以自己混合颜色(可能有一个可搜索的颜色混合算法),或者你可以使用 RGBA 的 alpha 组件来自动创建过渡。但是我不确定这两种方法的性能如何。但是在尝试之前你永远不会知道。 - HiFile.app - best file manager
听起来是个好主意,你有没有一个例子可以让我开始工作呢?因为我不知道从哪里开始(结合QImage和QGraphicsScene)。 - JerichoJosh
我一直对图形感兴趣,但从未尝试过这样的低级任务。我会从这里开始:http://qt-project.org/doc/qt-5.0/qtgui/qimage.html#pixel-manipulation 然后你只需要一些表示渐变计算的公式,即将(x,y)空间映射到(r,g,b)或(r,g,b,a)空间的数学函数。但我不确定如何结合QImage和QGraphicsScene...也许可以尝试QBrush::setTextureImage,然后使用此刷子进行绘画到QGraphicsScene,或者另一种方法是将QImage转换为QPixmap,然后调用QGraphicsScene::addPixmap。 - HiFile.app - best file manager
我已经使用OpenGL解决了这个问题,这是我的第二次尝试。无论如何,感谢您的努力。 - JerichoJosh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接