android 屏幕计算 屏幕显示算法_算法

提示:本文讲解在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。

android 屏幕计算 屏幕显示算法_线性代数_02

三、画椭圆

画椭圆和画圆类似,使用参数方程求解,公式如下。当圆心在原点,Xc,Yc等于0,椭圆需要求取1/4的坐标,即角度值取0-90°,然后通过镜像原理得出整个椭圆坐标。

android 屏幕计算 屏幕显示算法_线性代数_03

四、填充方法

上述方法画出的图形都只是一条线组成,我们可以通过填充让图形更加饱满。方法很简单,当我们计算出圆或椭圆外围上的一个坐标点之后,我们固定y坐标,x坐标递减到0,依次填充,以此类推直到填充完1/8(1/4),然后通过镜像原理填充其他位置。
圆环,椭圆环的填充,设外环和内环半径分别为R、r,横坐标x由0-R变化,当x<r时,只填充y(r)<y<y(R)部分,当r<x<R时,进行全部填充。

五、贝塞尔拟合算法

效果展示如链接:贝塞尔拟合算法

android 屏幕计算 屏幕显示算法_算法_04


如上图所示,对于平面上的两个点 P0 和 P1,假设另一点 B 匀速地从 P0 点运动到 P1 点,则有 B 点在 t 时刻的坐标公式:

android 屏幕计算 屏幕显示算法_android 屏幕计算_05


将 B 点在各个时刻的坐标依次连接起来所形成的线,就是所谓的贝塞尔曲线。此公式表示的是一次贝塞尔曲线,也称为线性贝塞尔曲线。二次贝塞尔曲线

android 屏幕计算 屏幕显示算法_贝塞尔曲线_06


同样地,对于平面上的三个点 P0、P1 和 P2 ,假设 P0 P1 之间有个点 B1 匀速地从 P0 运动到 P1 ,P1 P2 之间有个点 B2 匀速地从 P1 运动到 P2,则有:

android 屏幕计算 屏幕显示算法_android 屏幕计算_07


android 屏幕计算 屏幕显示算法_算法_08


假设另一点 B 匀速地从 B1 运动到 B2,则有 B 点的坐标公式:

android 屏幕计算 屏幕显示算法_算法_09


将 B1 和 B2 的坐标公式代入上面的表达式,整理后得到 B 点的坐标公式:

android 屏幕计算 屏幕显示算法_android 屏幕计算_10


B 点在各个时刻的坐标所连成的曲线即为二次贝塞尔曲线,其中 P0 和 P2 称为数据点,P1 称为控制点 ,n个控制点对应n+1次方程。三次贝塞尔曲线

android 屏幕计算 屏幕显示算法_线性代数_11


android 屏幕计算 屏幕显示算法_android 屏幕计算_12

一般参数公式n阶贝塞尔曲线可如下推断。给定点P0、P1、…、Pn,其贝塞尔曲线即:

android 屏幕计算 屏幕显示算法_斜率_13


android 屏幕计算 屏幕显示算法_线性代数_14


其中B和P都是向量,需要分别计算每个点的x和y的分量坐标。

示例:

android 屏幕计算 屏幕显示算法_线性代数_15

六、多项式拟合算法

设由实验测得函数y=f(x)在n个点x1 ,x2,…,xn的值为y1,y2,…,yn,要求这个函数的一个近似表达式。我们用一个次数低于n-1(m<n-1)的多项式φm(x)来拟合它,设

android 屏幕计算 屏幕显示算法_线性代数_16

android 屏幕计算 屏幕显示算法_android 屏幕计算_17


写成矩阵形式:

android 屏幕计算 屏幕显示算法_线性代数_18


已知函数表如下,试用二次多项式曲线来拟合这组数据。

android 屏幕计算 屏幕显示算法_线性代数_19


android 屏幕计算 屏幕显示算法_线性代数_20


android 屏幕计算 屏幕显示算法_斜率_21


计算列表如下:

android 屏幕计算 屏幕显示算法_线性代数_22


由上表得矩阵方程如下:

android 屏幕计算 屏幕显示算法_android 屏幕计算_23


android 屏幕计算 屏幕显示算法_贝塞尔曲线_24