当前位置:C++技术网 > 资讯 > GDI渐变:4 斜向渐变(0-90度)实现原理分析

GDI渐变:4 斜向渐变(0-90度)实现原理分析

更新时间:2016-11-06 15:52:59浏览次数:1+次

    前面介绍了垂直渐变和水平渐变的代码实现:GDI实现水平彩色渐变和垂直彩色渐变(单色渐变双色渐变和多色渐变)的代码

    照样,先给大家看看效果图:

1.0度渐变即垂直渐变

0度渐变即垂直渐变

2.30度渐变

30度渐变

3.45度渐变

45度渐变

4.60度渐变

60度渐变

5.90度渐变,即水平渐变

90度渐变,即水平渐变


    0度和90度渐变兼容了开头文章提到的垂直水平渐变。你可以用这个函数实现水平和垂直渐变,也可以直接用前面文章专用的水平垂直渐变。

    我们的渐变色是从白色RGB(255,255,255)到绿色RGB(0,255,0)渐变的。角度则决定了颜色的渐变角度。0度的时候是从顶部向下渐变,角度变大,白色也转移到左上方方位。直到90度时变为了正左方。

    要说水平渐变和垂直渐变简单方便,那么斜向渐变就不能简单的处理了。在实现斜向渐变的时候,我们需要进行三角函数计算。只有把各个细节定位好了,才不至于出现各种怪现象。

    我先来说说我遇见的三个现象:

1.斜向渐变出现的黑点黑线问题

    这个问题是由于相邻斜线并不能完全贴合,导致斜线时间产生了空隙。空隙的产生和角度有关。这个问题在文章《斜向颜色渐变的黑线黑点问题探究分析和解决方案》和《原因分析和验证:斜向颜色渐变的黑线黑点问题》得到了完美的解决和原因分析。

2.在计算tan值时,得到怪异的值

    在计算时,直接将度数传给了tan函数。事实上,我们要给的是弧度值,也就是要将度数和 π 做运算的值。这是三角函数运用不当问题,一开始大家很可能会中招。

3.斜向渐变的右下角有一个大黑块

    在计算渐变的次数即画斜线的条数的时候,少算了很多条,结果导致斜线没有铺满客户区,就出现了右下角的黑块。这个问题将在后面的原理分析中给出解释。


    所以说,斜向渐变还得把三角函数用好。其实也是很简单的应用咯,别慌。就是要 进行一些计算,才能画出称心如意的斜向渐变。比水平垂直的渐变稍微复杂点。

    下面开始讲讲斜向0-90度的斜向渐变原理,上图:

斜向0-90度的斜向渐变原理

    图中是一个坐标轴,就是窗口客户区的坐标轴。X轴向右为正,向下为正,所以特别标注了Y-Y+。粗线框是整个屏幕大小,细矩形框是窗口客户区。然后一大堆的斜线,就是用来产生斜向渐变的斜线。斜线有一个角度θ。

    使用GDI绘制线条时,要指定一个起点和结束点。我们画斜线填充矩形时,是从X轴的点开始,到Y+轴结束,保证在方便实现的前提下,绘制面积最小。

    左上角第一根斜线是第一种渐变色,右下角最后一根斜线是第二种渐变色,中间的斜线就是过渡的各种颜色。所有的线条排在一起就是渐变色效果了。

    我们在程序实现时,从X轴的0向右不断的增加。因为递增的时候,起点由X轴确定x点,那么我们根据角度,利用三角函数tan计算相交于Y+轴的点。这样就得到了两个点,就可以画斜线了。计算的公式在图中给出了。

    那么这里隐藏了两个细节。可能一些人对于Y轴下面为正感觉有点不舒服,可能会在计算y值时加上负号。不能加哦。角度为正的时候,tan值也是正的,得到的y点是正的,和坐标系吻合。不需要做额外的处理。

    另外需要注意的是,x轴递增的终点不是矩形的宽度哦。如果只是到达了宽度,那么右下角有一块是没有绘制斜线覆盖的。我们要通过角度计算图中标出的红色线的长度,依次来确定x轴递增的终点,这样就可以覆盖全部矩形区域。

    我们知道高度,知道角度,红线的长度自然也很好计算了,这里就不多说了,你自己动手简单算算就出来了。

    那么0-90度斜向渐变的原理就是以上这样了。后面在用一篇文章来说明实现代码吧。