多梯度笔刷在c++和GDI中实现的问题

Problem with Multigradient brush implementation from scatch in C++ and GDI

本文关键字:GDI 实现 问题 c++      更新时间:2023-10-16

我正在尝试用GDI在c++中从头开始实现渐变刷。我不想使用GDI+或任何其他图形框架。我希望梯度是任意方向的(任意角度)。

我的伪代码算法:

      For each pixel in x dirrection
      For each pixel in the y direction
          current position = current pixel - centre                      //translate origin 
          rotate this pixel according to the given angle
          scalingFactor =( rotated pixel + centre ) / extentDistance    //translate origin back 
          rgbColor = startColor + scalingFactor(endColor - startColor)

extentDistance是从矩形中心经过的线的长度,其梯度等于梯度的角度

到目前为止还不错。我可以画出来,看起来很漂亮。但不幸的是,由于旋转位矩形角有错误的颜色。结果是完美的,只有角度是90度的倍数。问题似乎是缩放因子不能在矩形的整个尺寸上缩放。

我不确定你是否明白我的意思,因为如果没有它的可视化,很难解释我的问题。

如果有人能帮助我或重定向到一些有用的材料,我将不胜感激。

好了,伙计们修好了。显然,问题在于当我旋转渐变填充(不是矩形)时,我没有正确计算缩放因子。梯度缩放的距离根据梯度方向变化。必须做的是找到旋转后矩形的边缘点的位置,并在此基础上找到应该缩放梯度的距离。基本上我的算法中需要修正的是extentDistance。

怎么做:

•变换所有四个角的坐标

•找到所有四个x中最小的minX

•找出所有四个x中最大的,并称之为maxX

•对y做同样的处理。

•这两个点(max和min)之间的距离是extentDistance