STM32绘制折线统计图
绘制折线统计图最关键的在于‘给定两点绘制一条线’,最简单的方法莫过于使用直线方程的斜截式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
