实现任意角度渐变填充(一) -- 双色渐变填充矩形

    在实现任意角度双色渐变填充矩形之前,先了解一下简单实现横向或者纵向的双色渐变填充矩形的过程:首先按2种颜色在x(或者y)方向的按长度比例填充一条直线,然后,不断移动y(或者x)坐标,反复复制该直线,直到达到矩形的高(宽度),如此就实现了整个矩形的填充过程。按照这个原理,同样也可实现矩形的任意角度双色渐变填充,只不过比较麻烦,我们先按以下思路来实现:

    1、按给定的渐变角度,计算出矩形中的最长的直线长度,计算公式为:

         maxsize = width * cos(angle) + height * sin(angle)

其中,width和height分别为矩形的宽度和高度,angle为渐变角度;

    2、根据计算的最大直线长度建立一个填充内存缓冲区(颜色数组),然后按直线长度比例计算出2种颜色在缓冲区中各元素的颜色值;

    3、按照与前面相同的计算公式,计算矩形内每个坐标点(x,y)在缓冲区的位置(公式中的width和height分别替换为x和y),逐点复制缓冲区颜色值在当前坐标点,直至整个矩形填充完毕。

    但是,由于矩形是平面,而颜色缓冲区只是一条直线,按上面公式计算的颜色缓冲区位置,只能正常实现0 - 90度(第一象限)的渐变填充,填充其它三个象限时,矩形平面各坐标点与直线颜色缓冲区各元素值并不能一一对应。

    可以考虑把任意填充角度转换为第一象限角度,将矩形内各坐标点旋转相应的角度(如填充第二象限就将坐标点旋转90度),这样矩形平面与直线颜色缓冲区的问题就可以解决。再可以考虑在180 - 360度角度填充时,把2种填充颜色颠倒过来,如此,就只需实现第一、二象限角度的填充,问题的复杂度就小多了。

    可能有朋友会说我把问题搞复杂化了:完全可以在填充每个象素点的同时,按照填充角度逐点比例计算2种颜色在该坐标点的颜色值。不错,这样问题可能会简单些,但由于填充颜色比例是在具体的象素填充过程中计算的,这种方法实现的填充速度肯定不会太快,而按照我前面的思路,只是事先按比例计算一条直线的填充颜色放在颜色缓冲区中,在具体象素填充循环中,只需要计算一下颜色缓冲区下标,这样实现的代码在填充速度上绝不比简单的横向或者纵向的双色渐变填充矩形速度逊色多少,而且我在实现具体象素填充时,将完全抛弃缓慢的浮点数运算。

    以下是用Delphi按上述思路实现的任意角度双色渐变填充矩形的代码:

    上面的填充代码实现主要是靠SetGradientColors和LinearGradientFill过程实现的,前者负责计算颜色缓冲区各元素的颜色值,后者则实现整个矩形填充过程,由于文章前面已经介绍了实现思路和步骤,代码中也有较详细的注释,就不再继续介绍了。

    上面的代码只是实现了矩形的双色实填充(拷贝),而没有实现带Alpha,即ARGB颜色的填充,因此是不完善的。但是,要实现ARGB颜色填充,将会使填充速度大大下降,而事实上使用ARGB颜色填充矩形的时候不是很多,而如果把RGB填充和ARGB填充过程分开来,倒是可以解决这个矛盾,可是上面已经是分别处理第一、二象限的代码,再来个RGB和ARGB分别处理,组合起来也很复杂,所以我把上面分别处理第一、二象限的2段代码统一起来(因为2段代码的流程差不多,不同的只是图像象素指针和增减量),再考虑到上面的代码不利于扩展(下一篇文章会扩展为多色填充),因此,下面给出重组、细化和功能扩充过的双色渐变填充矩形过程代码:

    上面的填充过程,在我的p4 2.8G 单核处理器计算机上(比较老了),模拟填充千万象素大小矩形,实拷贝填充时间为47ms,而Alpha填充时间则为243ms。

    下面是调用双色渐变填充矩形过程的例子和运行截图:

双色填充矩形界面截图

    指导和建议请来信:mao.maozefa@gmail.commaozefa@hotmail.com

 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值