2227|2

35

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

【微雪 RP2040双核开发板】评测2-绘制函数图形 [复制链接]

【微雪 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的功能。本文旨在为有限硬件资源条件下实现更多的功能开发提供一点思路。

下期我们将还要集中在硬件接口的功能评测。

此帖出自移动便携论坛

最新回复

画圆不错,有填充试过吗?  详情 回复 发表于 2022-12-7 18:01
点赞 关注
 
 

回复
举报

1万

帖子

24

TA的资源

版主

沙发
 

记得有算法是只需要整数计算,不用浮点数的,速度会快很多。

此帖出自移动便携论坛
 
 
 

回复

4771

帖子

12

TA的资源

版主

板凳
 

画圆不错,有填充试过吗?

此帖出自移动便携论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表