数码之家

 找回密码
 立即注册
搜索
查看: 3765|回复: 2

[Arduino] [esp8266_micropython] ssd1306绘制矩形

[复制链接]
发表于 2020-12-27 00:22:15 | 显示全部楼层 |阅读模式
代码
  1. from machine import Pin, I2C
  2. from ssd1306 import SSD1306_I2C
  3. import math
  4. import time


  5. def light_dot(x, y):
  6.     oled.pixel(x, y, 1)


  7. def draw_line(x1, y1, x2, y2, isRectangle=0):
  8.     '''
  9.     绘制线段
  10.     :param: x1 y1 x2 y2 线段两端
  11.     :param: isRetangle 是否为矩形
  12.     :return: None
  13.     '''
  14.     if (x1 == x2):
  15.         step = 1
  16.         if (y1 > y2):
  17.             step *= -1
  18.         while (y1 != y2):
  19.             light_dot(x1, y1)
  20.             y1 = y1 + step
  21.         light_dot(x2, y2)
  22.     else:
  23.         # y = kx+a
  24.         k = (y2 - y1) / (x2 - x1)
  25.         a = y1 - (k * x1)
  26.         step = 1
  27.         if (x1 > x2):
  28.             step *= -1
  29.         while (x1 != x2):
  30.             light_dot(x1, round(k * x1 + a))
  31.             x1 += step
  32.         light_dot(x2, y2)
  33.     if not isRectangle:
  34.         oled.show()


  35. def draw_rectangle(x, y, length, width, isFill=0):
  36.     '''
  37.     绘制矩形
  38.     :param: x y 矩形左上角
  39.     :param: length width 长和宽
  40.     :isFill: 是否填充 0 否 1 是
  41.     :return: None
  42.     '''
  43.     point_upper_left = (x, y)
  44.     point_upper_right = (x + length, y)
  45.     point_bottom_left = (x, y + width)
  46.     point_bottom_right = (x + length, y + width)

  47.     draw_line(point_upper_left[0], point_upper_left[1],
  48.               point_upper_right[0], point_upper_right[1], 1)
  49.     draw_line(point_upper_left[0], point_upper_left[1],
  50.               point_bottom_left[0], point_bottom_left[1], 1)
  51.     draw_line(point_bottom_left[0], point_bottom_left[1],
  52.               point_bottom_right[0], point_bottom_right[1], 1)
  53.     draw_line(point_upper_right[0], point_upper_right[1],
  54.               point_bottom_right[0], point_bottom_right[1], 1)

  55.     if isFill:
  56.         for xx in range(x, x + length + 1):
  57.             draw_line(xx, y, xx, y + width, 1)

  58.     oled.show()


  59. def draw_diamond(x, y, side_length, angle):
  60.     '''
  61.     绘制菱形
  62.     有点BUG -_- 勉强能用
  63.     :param: x y 菱形顶点
  64.     :param: side_length 边长
  65.     :angle: 顶角 [0,90]
  66.     :return: None
  67.     '''
  68.     xx = abs(round(math.sin(angle / 2) * side_length))
  69.     yy = abs(round(math.cos(angle / 2) * side_length))

  70.     point_upper = (x, y)
  71.     point_left = (x - xx, y + yy)
  72.     point_right = (x + xx, y + yy)
  73.     point_bottom = (x, y + yy * 2)

  74.     draw_line(point_upper[0], point_upper[1], point_left[0], point_left[1])
  75.     draw_line(point_upper[0], point_upper[1], point_right[0], point_right[1])
  76.     draw_line(point_bottom[0], point_bottom[1], point_left[0], point_left[1])
  77.     draw_line(point_bottom[0], point_bottom[1], point_right[0], point_right[1])


  78. if __name__ == '__main__':
  79.     i2c = I2C(scl=Pin(5), sda=Pin(4))
  80.     oled = SSD1306_I2C(128, 64, i2c)
  81.     oled.fill(0)

  82.     draw_rectangle(10, 10, 30, 20)
  83.     draw_rectangle(10, 40, 60, 20, 1)
  84.     draw_diamond(90, 10, 30, 45)
复制代码




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2020-12-28 19:42:06 | 显示全部楼层
讲道理,把所有图形无论规则与否全部拆成若干个像素点多次填充太慢了!
最好按照字节,一个字节一个字节填充,边界上可能有不满一个字节的情况,做好数据拆分判断就好了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-29 20:52:54 | 显示全部楼层
la45088d1 发表于 2020-12-28 19:42
讲道理,把所有图形无论规则与否全部拆成若干个像素点多次填充太慢了!
最好按照字节,一个字节一个字节填 ...

是的,为了效率应该按字节填充,或者维护一个屏幕帧。
但是,选择使用python,就已经把效率放在第二位了,方便才是第一位的。
个人也没有效率方面的需求,就怎么简单怎么来了。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-29 02:57 , Processed in 0.156000 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表