数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4614|回复: 4

[Arduino] [esp8266_micropython] ssd1306绘制圆形与圆弧

[复制链接]
发表于 2020-12-22 21:50:37 | 显示全部楼层 |阅读模式
本帖最后由 mao_jin_dao 于 2020-12-23 22:58 编辑

代码1 圆
  1. from machine import Pin, I2C
  2. from ssd1306 import SSD1306_I2C
  3. import math

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

  6. def draw_circle(x,y,r,fill=0):
  7.    '''
  8.    绘制圆形
  9.    :param x,y  圆心坐标
  10.    :param r  圆心半径
  11.    :param fill 0 不填充  1 填充
  12.    '''
  13.    angleList = [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.6, 0.65, 0.7, 0.75, 0.7853981633974483, 0.8, 0.85, 0.9, 0.95, 1.0, 1.05, 1.1, 1.15, 1.2, 1.25, 1.3, 1.35, 1.4, 1.45, 1.5, 1.55, 1.5707963267948966, 1.6, 1.65, 1.7, 1.75, 1.8, 1.85, 1.9, 1.95, 2.0, 2.05, 2.1, 2.15, 2.2, 2.25, 2.3, 2.35, 2.356194490192345, 2.4, 2.45, 2.5, 2.55, 2.6, 2.65, 2.7, 2.75, 2.8, 2.85, 2.9, 2.95, 3.0, 3.05, 3.1, 3.141592653589793, 3.15, 3.2, 3.25, 3.3, 3.35, 3.4, 3.45, 3.5, 3.55, 3.6, 3.65, 3.7, 3.75, 3.8, 3.85, 3.9, 3.9269908169872414, 3.95, 4.0, 4.05, 4.1, 4.15, 4.2, 4.25, 4.3, 4.35, 4.4, 4.45, 4.5, 4.55, 4.6, 4.65, 4.7, 4.71238898038469, 4.75, 4.8, 4.85, 4.9, 4.95, 5.0, 5.05, 5.1, 5.15, 5.2, 5.25, 5.3, 5.35, 5.4, 5.45, 5.497787143782138, 5.5, 5.55, 5.6, 5.65, 5.7, 5.75, 5.8, 5.85, 5.9, 5.95, 6.0, 6.05, 6.1, 6.15, 6.2, 6.25, 6.283185307179586];
  14.    for i in angleList:
  15.      light_dot(x+round(math.sin(i)*r),y+round(math.cos(i)*r))
  16.    if fill:
  17.      powR = math.pow(r,2)
  18.      for xx in range(x-r,x+r):
  19.        for yy in range(y-r,y+r):
  20.          if ( (math.pow(xx-x,2)+math.pow(yy-y,2)) < powR):
  21.            light_dot(xx,yy)
  22.   oled.show()
  23.   
  24. if __name__ == '__main__':
  25.    
  26.    i2c = I2C(scl=Pin(5), sda=Pin(4))
  27.    oled = SSD1306_I2C(128, 64, i2c)  
  28.    oled.fill(0)
  29.    oled.show()
  30.   
  31.    draw_circle(25,25,20,1)
  32.    draw_circle(75,25,20,1)
  33.    draw_circle(50,32,30)
复制代码
代码2 圆弧与圆
  1. from machine import Pin, I2C
  2. from ssd1306 import SSD1306_I2C
  3. import math


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


  6. def draw_circular_arc(x, y, r, start_angle, end_angle, isCircular=0):
  7.   '''
  8.   绘制圆弧
  9.   :x,y 圆心坐标
  10.   :r 半径
  11.   :start_angle,end_angle 角度范围
  12.   :isCircular 是否为圆 未使用abs(start_angle-end_angle)>360,因为与使用者自由。
  13.   '''
  14.   # 0度的位置有点怪,顺时针转了90度。+90度作为补偿。
  15.   angleList = [math.radians(i+90) for i in range(start_angle, end_angle+1)]
  16.   for i in angleList:
  17.     light_dot(x+round(math.sin(i)*r), y+round(math.cos(i)*r))
  18.   if not isCircular:
  19.     oled.show()


  20. def draw_circular(x, y, r, fill=0):
  21.   '''
  22.   绘制圆,并决定是否填充
  23.   :x,y 圆心坐标
  24.   :r 半径
  25.   :fill 是否填充 0 否 1 是
  26.   '''
  27.   draw_circular_arc(x, y, r, 0, 360, isCircular=1)
  28.   if fill:
  29.     powR = math.pow(r, 2)
  30.     for xx in range(x-r, x+r):
  31.       for yy in range(y-r, y+r):
  32.         if ((math.pow(xx-x, 2)+math.pow(yy-y, 2)) < powR):
  33.           light_dot(xx, yy)
  34.   oled.show()


  35. if __name__ == '__main__':

  36.   i2c = I2C(scl=Pin(5), sda=Pin(4))
  37.   oled = SSD1306_I2C(128, 64, i2c)
  38.   oled.fill(0)

  39.   draw_circular_arc(25, 25, 12, 20, 160)
  40.   draw_circular_arc(50, 25, 12, 20, 160)
  41.   draw_circular_arc(38, 35, 15, 200, 340)
  42.   draw_circular(90, 25, 20, 1)
复制代码






本帖子中包含更多资源

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

x
发表于 2020-12-23 06:49:54 | 显示全部楼层
感觉语句15应该可以简化。
回复 支持 反对

使用道具 举报

发表于 2020-12-23 16:00:54 来自手机浏览器 | 显示全部楼层
我猜想应该是可以纯计算出来的,但是计算量有点大,单片机受不了,所以用了数组,数组越大越细致,分辨率低的话数组应该可以简化点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 22:49:26 | 显示全部楼层
xy1 发表于 2020-12-23 06:49
感觉语句15应该可以简化。

是的。圆有阙,用列表生成式替换了一下。
  1. angleList = [math.radians(i) for i in range(0, 360)]
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-23 22:50:45 | 显示全部楼层
玛德陛下 发表于 2020-12-23 16:00
我猜想应该是可以纯计算出来的,但是计算量有点大,单片机受不了,所以用了数组,数组越大越细致,分辨率低 ...

嗯。放大图后,明显看到圆有阙。所以分辨率不能再低了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-2 12:42 , Processed in 0.156000 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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