绘制折线统计图最关键的在于‘给定两点绘制一条线’,最简单的方法莫过于使用直线方程的斜截式y = kx + b以及

由y = kx + b => kx+b-y = 0 => kx+b-y = 0 => kx-y=-b => -kx+y = b

我们可以很轻易的使用 kx-y=-b计算出b的值,以及k=(y1 – y0) / (x1-x0)计算出k值

void DrawLine(float x0, float y0, float x1, float y1)
{
    float k = (y1-y0) / (x1-x0);
    float b = -k * x0 + y0;
    float y = 0.0f;

    for(float x = x0; x <= x1; x += 0.2)
    {
        y = k * x + b;
        y = y + 0.5;
        BMP[Y_SIZE-(int)y][(int)(x+0.5)] = 1;
    }
}

DDA算法

DDA算法是计算机图形学中最基础简单的绘制直线算法,其主要思想是由直线公式y = kx + b推导出来的。

在求出k和b的值的情况下,我们就能知道指定x对应的y值,由y=kx+b可知如果x值步进1,那么y就步进k+b,相同的,如果y步进1则x的步进(1-b)/k,接着向下取整即可得到要绘制的点

void DrawLineDDA(float x0, float y0, float x1, float y1)
{
    u8 i=1;
    float dx, dy, length, x, y;
    if (fabs(x1 - x0) >= fabs(y1 - y0)) length = fabs(x1 - x0);
    else length = fabs(y1 - y0);
    dx = (x1 - x0) / length;
    dy = (y1 - y0) / length;
    x = x0;
    y = y0;
    while (i<=length) {
        BMP[Y_SIZE-(int)(y + 0.5)][(int)(x+0.5)] = 1;
        x = x + dx;
        y = y + dy;
        i++;
    }
}

基于以上两种算法(任选其一),就可以很轻松的做出折线统计图了:点击查看LineChart.c