C ++和GDI中从头开始实现Multi Gradient画笔的问题

时间:2011-08-17 11:14:36

标签: c++ gdi linear-gradients gradients lineargradientbrush

我正在尝试使用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度的倍数的角度是完美的。问题似乎是缩放因子不会在矩形的整个大小上缩放。

我不确定你是否得到了我的观点cz如果没有它的可视化就很难解释我的问题。

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

1 个答案:

答案 0 :(得分:1)

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

怎么做:

•变换所有四个角的坐标

•找出所有四个x中最小的x作为minX

•找到所有四个x中最大的一个,并将其命名为maxX

•为y做同样的事。

•这两点之间的距离(最大值和最小值)是extentDistance