深入了解OLED模块的单片机应用(三)

学习目标:

  • OLED绘制图形原理

  • 学习内容:

    1. 绘制正弦曲线
    2. 用三角函数画圆圈
    3. 比较法画圆的算法
    4. 画圆角矩形的画法
    5. 宽边圆角矩形的画法

    一、 绘制正弦曲线
    在正弦函数的坐标系中,如果设置横向坐标x代表角度,竖向坐标y代表这个角度对应的正弦函数的数值,那么每一个x和y的值都指向坐标系中的一个点,这些点集合起来,就组成了正弦函数的波形曲线


    下面建立一个画正弦函数曲线的函数,首先声明两个变量x0和y0,用来设置曲线的坐标系的原点坐标,在屏幕的中心,然后声明几个浮点型变量Si、Sx、Sy、Rad,变量Si是角度值的范围,就取-180度到180度,递增步长为1,由于C语言中的三角函数使用弧度值来计算的,使用变量Rad是将角度值换算成弧度值,边梁Sx表示要画的点的x坐标,因为角度值的横向数量是360个,而屏幕宽度只有128个像素点,所以将横向宽度除以一个比例系数,将波形的显示宽度,缩小到屏幕范围之内,这里去3.5,变量Sy是要画的点的y坐标,又因为正弦值的范围是-1到1,所以还要将计算得到的正弦函数值乘以一个比例系数25进行放大,然后就可以用画点函数把这个点显示出来,其中坐标Sx和Sy要分别加上x0和y0,将曲线的位置偏移到屏幕中心,同时用64于y坐标相减,用来将屏幕的坐标系上下翻转,最后刷新一下屏幕,这个函数就完成了。

    在演示函数调用一下

    画出了波形曲线,还可以试着将两个电位器,连接到单片机的两个ADC引脚上,用来改变变量Sx和Sy的缩放比例系数,于是就可以自由地控制,显示波形的宽度和高度了

    二、用三角函数画圆圈
    在屏幕上画圆,同样需要确定圆心的位置,还有半径的长度,然后计算出到圆心的距离等于半径长度的点,就组成了一个圆

    假设圆上的点的坐标值是(Rx,Ry),要计算出这些坐标值,也有很多种方法,首先介绍最简单粗暴的一种,就是以圆心为原点建立一个坐标系,圆上的点就与坐标轴构成了一个直角三角形,可以看到三角形的横边就是这个点到原点的横向距离Rx,三角形的竖边是这个点到原点的竖向距离Ry,而三角形的斜边则是这个圆的半径R,假设三角形以原点为顶点的夹角的角度为Rad,就可以得到Rx等于半径R乘以角度的余弦值cos(Rad),Ry则等于半径R乘以角度的正弦值sin(Rad),于是就得到了这个点在这个坐标系中的坐标值


    下面创建一个画圆的函数

    调用一下,画出了一个完美的圆圈

    接下来创建一个画椭圆的函数

    画出了一个椭圆

    另外,用这种计算方法,不但能够画出一个完整的圆圈,通过改变结束角度,还可以画出一段任意圆心角度的圆弧

    再如果,将起始角度和结束角度都进行改变,还可以任意调整圆弧的长度和位置

    不过,用这种方式画圆,每次都要经过360次计算,而且计算对象都是浮点数,对于单片机的计算效率会有不少影响,所以接下来的内容中,就再介绍一下同样非常常用的,并且计算效率相对比较高的画圆方法

    三、比较法画圆的算法
    假设要画的圆的半径是R,因为OLED屏幕是由一个一个像素点排列组成的,所以在屏幕上显示出的圆,实际上是一个一个到圆心的距离最为接近半径长度的点的集合,因为圆具有对此性,所以如果通过圆心分别以0度、45度、90度和135度画四条对称轴,就可以将整个圆分成处于四个象限的八段圆弧,如果在45度和90度之间的圆弧上,取一个点(x,y),那么根据圆的对称性,就可以在其余七段圆弧上,分别找到对应坐标值的点,因此只需要计算出一段圆弧上的点的坐标,通过坐标值的变换,就可以画出一个完整的圆了

    第一种方法是通过勾股定理,直接判断圆上的点的位置,当x等于0的时候,y的值是半径R;随着x的值逐渐加一,对应的y的值保持不变的情况下,如果对应的点到圆心的距离超出了半径长度,就让y坐标向下移动一格,如果距离小于半径长度,就让y的值继续保持不变,按照这个规律,让x的值一直加下去,直到x的值大于y的值,说明下一个点的位置,超出了90度到45度夹角的范围,于是计算结束。
    在这个过程中,每算出一个坐标值(x,y),都用坐标变换的方式,画出坐标系中的八个点,一个圆就画好了。


    第二种画圆的方法,判断y坐标位置的思路,比第一种方法的稍微复杂一些,是随着坐标值x的递增,通过判断对应的y坐标的位置,距离屏幕上的哪一个像素点的坐标值更近一些,就点亮哪一个像素点,根据这个思路,可以推导出坐标值(x,y)的变化规律,判断发放有很多种,比如中点画圆算法、Bresenham算法等等,由于推导过程略微复杂,所以这里就直接贴出其中一种算法的推导结果

    可以看到,在这两种画圆的方法计算坐标值的过程中,只用到了简单的判断和整数运算,而不需要任何浮点数的参与,并且只需要算出圆的八分之一,就可以画出一个完整的圆,画点的次数也只有半径长度的根二分之一的八倍,相对于用角度通过进行浮点数运算画出360个点,显然是更加简介高效的方法

    可以看出,用第二种算法画出的圆,更加接近完美的圆

    四、画圆角矩形的画法
    通过计算出八分之一的圆弧,就可以画出一个完整的圆

    如果将圆分成四个部分,并且分别画在不同的位置,然后再用画线函数,将四段圆弧的首尾连接起来,就可以画出一个圆角的矩形




    创建画圆角矩形函数



    显示结果

    作者:_不吃早饭_

    物联沃分享整理
    物联沃-IOTWORD物联网 » 深入了解OLED模块的单片机应用(三)

    发表评论