menu
如何实现渐变直线

这里的直线要求渐变,因此使用 MoveToLineTo 画线是行不通的,我们需要手动实现点动成线。之前计算机图形学研究过 DDA 画线算法和中点画线算法,下面就简单改一改拿来画线了。

先来道应用题:
假如一条线有512个点,要实现从黄色 RGB(255,255,0) 渐变到白色 RGB(255,255,255) 。这里涉及到一些映射的概念,在于将256种颜色分布到512个点上。大概可以得到以下的数学公式:

pixel_color / pixel_order = color_count / pixel_count

看不懂的话,再来用分组的思想来看,把512个像素点分成256组,每组分得2个点。设「dotX」为这些像素点中的第X个,用X/2就可以得出「dotX」属于第组,这里的「几」就是它对应的颜色。

画线是按点进行 SetPixel 的,可以想象纸带打孔机工作时的状态,所以只要找出点和颜色的对应关系就好了。有如下函数 getColorByOrder ,输入点的次序,输出点应有的颜色。下面就来写这个函数:

COLORREF getColorByOrder(int order) 
{
    int a = 512 / 256;
    return RGB(255, 255, order / a);
}

接下来把一些变量代入就可以变成通用函数了。通过以上算法亦可实现渐变矩形、多色渐变等。

渐变矩形

#渐变矩形

颜色分段直线

#颜色分段直线

本文作者:Anapopo
本文采用 CC BY-NC-SA 3.0 Unported 协议进行许可,阅读 相关说明
本文链接:https://blog.kiko.space/2018/04/03/draw-a-gradient-line/