【微雪 RP2040双核开发板】评测2-绘制函数图形
MicroPython 的matplotlib、turtle具有丰富的图形绘制功能,但RP2040-LCD-1.28的MicroPython并未集成,仅提供了framebuf库,起基本图形绘制DDZZ669作者在玩转RP2040之LCD绘制基本形状测试 已经作了详细介绍,在此不重复。但framebuf不具备画斜线、圆弧等功能,本文讲提供斜线、圆弧的python程序。
主要用到framebuf.pixel()函数,具体格式为:
FrameBuffer.pixel(x, y[, c]),x,y为坐标值,c为像素点的颜色。
一、画斜线
#x1,y1,x2,y2分别为直线的起点和终点坐标,l_width是先宽,line_color是线的颜色
def line(x1,y1,x2,y2,l_width,line_color):
k=y2-y1
k1=x2-x1
l_line=int(math.sqrt(k1*k1+k*k)+0.5)
print(k,l_line,line_color)
for j in range(0,l_line+1):
y3=y1+int(j*k/l_line+0.4)
x3=x1+int(j*k1/l_line+0.4)
print(x3,y3)
for i in range(0,l_width):
LCD.pixel(x3+i,y3,line_color)
二、画圆弧
#画圆函数,r半径,sdeg起始角度,edeg结束角度,pen笔的像素,color1笔的颜色
def cir(r,sdeg,edeg,pen,color1):
pens=pen
pencolor=color1
radius=r
for pen in range(1,pens):
rad1=radius-pen
for i in range(sdeg*5,edeg*5):
y=int(rad1*math.sin(math.pi*i/900)+0.5)
x=int(rad1*math.cos(math.pi*i/900)+0.5)
LCD.pixel(120-x,120-y,pencolor)
三、正弦函数
#画三角函数y=sin(wt),a幅度,w频率,pencolor笔的颜色
def sinef(a,w,pencolor):
y0=0
for i in range(0,720*w,2*w):
x=int(i/3/w)
y1=int(a*math.sin(math.pi*i/360)+0.5)
LCD.pixel(x,120-y1,pencolor)
四、运行结果
1、画斜线
from machine import Pin,I2C,SPI,PWM,ADC
import framebuf
import time
import math
#import image
I2C_SDA = 6
I2C_SDL = 7
DC = 8
CS = 9
SCK = 10
MOSI = 11
RST = 12
BL = 25
# LCD_1inch28()为RP2040-LCD-1.28官方提供的python例程中的类
LCD = LCD_1inch28()
LCD.set_bl_pwm(65535)
#x1,y1,x2,y2分别为直线的起点和终点坐标,l_width是先宽,line_color是线的颜色
def line(x1,y1,x2,y2,l_width,line_color):
k=y2-y1
k1=x2-x1
l_line=int(math.sqrt(k1*k1+k*k)+0.5)
for j in range(0,l_line+1):
y3=y1+int(j*k/l_line+0.4)
x3=x1+int(j*k1/l_line+0.4)
for i in range(0,l_width):
LCD.pixel(x3+i,y3,line_color)
if __name__=='__main__':
LCD.fill(LCD.white)
#画菱形
line(50,100,100,50,4,LCD.red)
line(100,50,150,100,4,LCD.blue)
line(50,100,100,150,4,LCD.red)
line(100,150,150,100,4,LCD.blue)
LCD.show()
while(True):
time.sleep(0.1)
2、画圆弧
画圆弧的指令是:
cir(r,sdeg,edeg,pen,color1)
式中r为半径,sdeg、edeg分别是起始角度和结束角度,pen笔粗细(像素点),color1笔的颜色。使用时需注意,该画圆弧函数的圆心在屏幕的中心点(120,,120),起始角度θ计算起点见下图,顺时针为正,逆时针为负。
将上面程序中的line(50,100,100,50,4,LCD.red)等4条语句删除,换为:
cir(100,-90,90,3,LCD.blue)
cir(100,0,90,3,LCD.blue)
cir(100,0,360,3,LCD.blue)
运行后得到如下图形。
如需在任意位置画圆弧,仅需将画圆弧函数稍加改造即可,增加圆心起始坐标)值(x0,y0),将
def cir(r,sdeg,edeg,pen,color1)
y=int(rad1*math.sin(math.pi*i/900)+0.5)
x=int(rad1*math.cos(math.pi*i/900)+0.5)
改为:
def cir(r,x0,y0,sdeg,edeg,pen,color1)
y=y0+int(rad1*math.sin(math.pi*i/900)+0.5)
x=x0+int(rad1*math.cos(math.pi*i/900)+0.5)
3、正弦函数
W=1:
执行函数 sinef(50,1,LCD.red)
W=3
执行函数 sinef(50,3,LCD.red)
五、总结
基于python的framebuf库,我们可以通过FrameBuffer.pixel(x, y[, c])函数实现绘制我们所需要的图形,得到类似于matplotlib的功能。本文旨在为有限硬件资源条件下实现更多的功能开发提供一点思路。
下期我们将还要集中在硬件接口的功能评测。