提示:本文讲解在LCD、LED上各种图形显示的算法原理
一、画点、画线
1:画点的实现是整个画图最基础的功能,其原理是对屏幕上最小的单位(像素点)进行赋值,驱动屏幕上不同像素点的状态。
2:画线的实现根据直线方程y=a*x+b
,这里将方程简化成y=a*x
,将直线与y轴的交点设为原点。这里直线划分为两个类型:斜率绝对值等于1为界限,若不分类则会出错。举个栗子:
1)当斜率等于0.5时,如y=0.2x
,当x取值1-->20
,y的值为0.2 0.4 0.6 0.8.....3.6 3.8 4
但y的值只能为整数,这里采用四舍五入的方式,可以看到,斜率在小于1的情况下x轴和y轴都是正常连续的。
2)但斜率大于1时,如y=10x
,当x取值1-->20
,y的值为10 20 30.......180 190 200
,明显此时x轴连续,但y轴却是间隔了10个点,屏幕上显示的也是一个个分开的点。
3)所以当直线斜率绝对值大于1时,我们可以假象将坐标轴旋转九十度,以y轴坐标为起始,函数化为x=y*1/a
,即x=0.1y
,此时y从1开始递增,x的值也是连续的。当以x的值递增时,先画出第一象限的直线,当以y的值递增时,先画出第二象限的直线,另一部分通过镜像原理画出。
思路总结:首先确定坐标原点,其次根据斜率确定递增轴,最后通过镜像画出整条直线
二、画圆
画圆的实现依据的是坐标原点和圆的半径r,将圆的半径作为直角三角形的斜边,x和y轴坐标作为直角边。以x轴为递增轴,由1-->x=y
,由勾股定理得出y轴数据,同样采用四舍五入的方式,画出1/8圆弧。这里的的圆弧处在第一象限,要将第一象限补全,方法是将得到的坐标倒置,如:(2,5)-->(5,2)
这样就得到了1/4圆弧,最后通过镜像原理得到整个圆。注意注意注意!!!以上方法由于圆弧斜率的变化导致像素点分布不均,随着斜率绝对值增大,随着x轴递增,y轴的间隔会不断增大,所以要先画出1/8圆再镜像处理
另外,也可以使用参数方程求解,如下:角度值取0-45°得1/8圆再镜像处理,这样保证像素点均匀分布,当圆心在原点,Xc,Yc等于0。
三、画椭圆
画椭圆和画圆类似,使用参数方程求解,公式如下。当圆心在原点,Xc,Yc等于0,椭圆需要求取1/4的坐标,即角度值取0-90°,然后通过镜像原理得出整个椭圆坐标。
四、填充方法
上述方法画出的图形都只是一条线组成,我们可以通过填充让图形更加饱满。方法很简单,当我们计算出圆或椭圆外围上的一个坐标点之后,我们固定y坐标,x坐标递减到0,依次填充,以此类推直到填充完1/8(1/4),然后通过镜像原理填充其他位置。
圆环,椭圆环的填充,设外环和内环半径分别为R、r,横坐标x由0-R变化,当x<r
时,只填充y(r)<y<y(R)
部分,当r<x<R
时,进行全部填充。
五、贝塞尔拟合算法
效果展示如链接:贝塞尔拟合算法
如上图所示,对于平面上的两个点 P0 和 P1,假设另一点 B 匀速地从 P0 点运动到 P1 点,则有 B 点在 t 时刻的坐标公式:
将 B 点在各个时刻的坐标依次连接起来所形成的线,就是所谓的贝塞尔曲线。此公式表示的是一次贝塞尔曲线,也称为线性贝塞尔曲线。二次贝塞尔曲线
同样地,对于平面上的三个点 P0、P1 和 P2 ,假设 P0 P1 之间有个点 B1 匀速地从 P0 运动到 P1 ,P1 P2 之间有个点 B2 匀速地从 P1 运动到 P2,则有:
假设另一点 B 匀速地从 B1 运动到 B2,则有 B 点的坐标公式:
将 B1 和 B2 的坐标公式代入上面的表达式,整理后得到 B 点的坐标公式:
B 点在各个时刻的坐标所连成的曲线即为二次贝塞尔曲线,其中 P0 和 P2 称为数据点,P1 称为控制点 ,n个控制点对应n+1次方程。三次贝塞尔曲线
一般参数公式n阶贝塞尔曲线可如下推断。给定点P0、P1、…、Pn,其贝塞尔曲线即:
其中B和P都是向量,需要分别计算每个点的x和y的分量坐标。
示例:
六、多项式拟合算法
设由实验测得函数y=f(x)在n个点x1 ,x2,…,xn的值为y1,y2,…,yn,要求这个函数的一个近似表达式。我们用一个次数低于n-1(m<n-1)的多项式φm(x)来拟合它,设
写成矩阵形式:
已知函数表如下,试用二次多项式曲线来拟合这组数据。
计算列表如下:
由上表得矩阵方程如下: