【问题标题】:Problem with Multigradient brush implementation from scatch in C++ and GDI在 C++ 和 GDI 中从头开始实现多渐变画笔的问题
【发布时间】:2011-08-17 11:14:35
【问题描述】:

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

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

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

【问题讨论】:

  • 发布您的实际代码可能会更有帮助。伪代码看起来没问题,所以问题可能出在实现的细节上。
  • 好吧,根据我目前所做的,我认为实际实施没有问题。我认为问题在于我的算法。该代码有效,但由于我提到的问题,它还不够好。因此,我要的是一种正式的或至少经过测试的算法来实现渐变效果!

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


【解决方案1】:

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

怎么做:

•变换所有四个角的坐标

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

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

•对 y 做同样的事情。

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

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-22
    • 1970-01-01
    相关资源
    最近更新 更多