多梯度笔刷在c++和GDI中实现的问题
Problem with Multigradient brush implementation from scatch in C++ and GDI
我正在尝试用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
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 如何在 GDI 绘制的 MFC 的 CScrollView 中实现缩放
- 多梯度笔刷在c++和GDI中实现的问题
- 有没有一种方法可以在GDI+中实现层