ESP32学习笔记3 -- WS2812 16*16点阵的点线面绘画
[复制链接]
大家晚上好,上次强占的发帖位这次给大家补上了
上次初步介绍了WS2812的16*16点阵 传送门在这里 -----> https://bbs.eeworld.com.cn/thread-1141816-1-1.html
有兴趣的可以看一下啊
一个图形是由线条组成的,而线条是由点构成的,那么画点则是重中之重
首先我想建立一个坐标系,就是所有的点都在坐标系上,坐标为横向1-16,纵向1-16
在画点的时候我做种考虑了一下16*16点阵的重要要素
第一要有图形的感念 图形是你要在点阵上面表示的东西 它是一个列表 ,列表里面是数字WS2812的编号 即要点亮和改变的灯
第二要有颜色的感念 每个灯都可以有不同的颜色,颜色是一个列表,里面是一个一个的元组红绿蓝的组合
第三要有页的感念 每一页都是有图形 颜色和非图形以外灯的结合体,我想页是由灯与颜色的对应关系组成
第四要有动态图的感念 ,就是很多个页组成的集合体(我现在还没有写到这里,所以这些是我的猜想)
好吧废话不多说,上干货 画点走起
- from machine import Pin
- from neopixel import NeoPixel
- import time
- p5 = Pin(5,Pin.OUT)
- np = NeoPixel(p5,256)
- r = g = b = 0
-
-
-
-
-
- yanse = []
- tuxing = []
- ye = []
- def dian(x,y) :
- if x == 1 :
- return 16 - y
- if x == 2 :
- return 15 + y
- if x == 3 :
- return 48 - y
- if x == 4 :
- return 47 + y
- if x == 5 :
- return 80 - y
- if x == 6 :
- return 79 + y
- if x == 7 :
- return 112 - y
- if x == 8 :
- return 111 + y
- if x == 9 :
- return 144 - y
- if x == 10 :
- return 143 + y
- if x == 11 :
- return 176 - y
- if x == 12 :
- return 175 + y
- if x == 13 :
- return 208 - y
- if x == 14 :
- return 207 + y
- if x == 15 :
- return 240 - y
- if x == 16 :
- return 239 + y
-
- def hua (x,y) :
- zi = dian(x,y)
- np[zi] = (11,22,33)
- np.write()
通过输入 X和Y的值来计算出灯的编号 比如说点亮10 * 10 的这个灯
会画点了我们就进一步画线
线是由很多个点组成的,因为分辨率实在太低 所以我这里就做了简单的直线和45度斜线
源码如下
- from machine import Pin
- from neopixel import NeoPixel
- import time
- p5 = Pin(5,Pin.OUT)
- np = NeoPixel(p5,256)
- r = g = b = 0
-
-
-
-
-
-
-
-
- def dian(x,y) :
- if x == 1 :
- return 16 - y
- if x == 2 :
- return 15 + y
- if x == 3 :
- return 48 - y
- if x == 4 :
- return 47 + y
- if x == 5 :
- return 80 - y
- if x == 6 :
- return 79 + y
- if x == 7 :
- return 112 - y
- if x == 8 :
- return 111 + y
- if x == 9 :
- return 144 - y
- if x == 10 :
- return 143 + y
- if x == 11 :
- return 176 - y
- if x == 12 :
- return 175 + y
- if x == 13 :
- return 208 - y
- if x == 14 :
- return 207 + y
- if x == 15 :
- return 240 - y
- if x == 16 :
- return 239 + y
-
- def huaxian(x1,y1,x2,y2) :
- xian = []
- x3 = y3 = 0
- if x1 == x2 :
- if y1 == y2 :
- xian.append(dian(x1,y1))
- if y1 > y2 :
- for i in range (y1-y2+1) :
- xian.append(dian(x1,y2+i))
- if y1 < y2 :
- for i in range (y2-y1+1) :
- xian.append(dian(x1,y1+i))
- if x1 > x2 :
- x3 = x1
- x1 = x2
- x2 = x3
- y3 = y1
- y1 = y2
- y2 = y3
- if x1 != x2 :
- if y1 == y2 :
- for i in range (x2-x1+1) :
- xian.append(dian(x1+i,y1))
- if y1 > y2 :
- if y1 - y2 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1-i))
- if y1 < y2 :
- if y2 - y1 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1+i))
- for i in range(len(xian)) :
- np[xian[i]] = (11,22,33)
- np.write()
-
-
-
在这里我画了两条线,分别是(1,1)到 (10,10)的和(1,16)到(16,16)的
画完线之后就要画图形了 我在这里先拿了一个硬骨头来啃,就是画三角形。
为啥说三角形是硬骨头呢,看我的思路慢慢道来吧
在低像素中只能画这样8种三角形
那么每种三角形都有一个不同的算法
在画三角形的时候我在函数里面添加了填充或不填充两种选择
具体看函数吧 有问题再帖子下面留言
- from machine import Pin
- from neopixel import NeoPixel
- import time
- p5 = Pin(5,Pin.OUT)
- np = NeoPixel(p5,256)
- r = g = b = 0
- tuxing = []
-
-
-
-
-
-
-
-
-
- def dian(x,y) :
- if x == 1 :
- return 16 - y
- if x == 2 :
- return 15 + y
- if x == 3 :
- return 48 - y
- if x == 4 :
- return 47 + y
- if x == 5 :
- return 80 - y
- if x == 6 :
- return 79 + y
- if x == 7 :
- return 112 - y
- if x == 8 :
- return 111 + y
- if x == 9 :
- return 144 - y
- if x == 10 :
- return 143 + y
- if x == 11 :
- return 176 - y
- if x == 12 :
- return 175 + y
- if x == 13 :
- return 208 - y
- if x == 14 :
- return 207 + y
- if x == 15 :
- return 240 - y
- if x == 16 :
- return 239 + y
-
-
-
- def huaxian(x1,y1,x2,y2) :
- xian = []
- x3 = y3 = 0
- if x1 == x2 :
- if y1 == y2 :
- xian.append(dian(x1,y1))
- if y1 > y2 :
- for i in range(y1-y2+1) :
- xian.append(dian(x1,y2+i))
- if y1 < y2 :
- for i in range(y2-y1+1) :
- xian.append(dian(x1,y1+i))
- if x1 > x2 :
- x3 = x1
- x1 = x2
- x2 = x3
- y3 = y1
- y1 = y2
- y2 = y3
- if x1 != x2 :
- if y1 == y2 :
- for i in range(x2-x1+1) :
- xian.append(dian(x1+i,y1))
- if y1 > y2 :
- if y1 - y2 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1-i))
- if y1 < y2 :
- if y2 - y1 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1+i))
- return xian
-
-
-
-
-
- def sanjiao (x1,y1,x2,y2,x3,y3,t=0):
- global tuxing
- x4 = y4 = 0
- bian = []
- if t == 0 :
-
- bian = huaxian(x1,y1,x2,y2)
- for i in range(len(bian)) :
- tuxing.append(bian[i])
-
- bian = huaxian(x1,y1,x3,y3)
- for i in range(len(bian)) :
- tuxing.append(bian[i])
-
- bian = huaxian(x2,y2,x3,y3)
- for i in range(len(bian)) :
- tuxing.append(bian[i])
-
- tuxing = list(set(tuxing))
- if t == 1 :
- if x2 == x3 :
- if y3 == y2 :
- tuxing = huaxian(x3,y3,x2,y2)
- if y2 < y3 :
- y4 = y2
- x4 = x2
- y2 = y3
- x2 = x3
- y3 = y4
- x3 = x4
- if y3 != y2 :
- if x1 > x2 :
- for i in range(x1-x2+1):
- bian = huaxian(x2+i,y2-i,x3+i,y3+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if x2 > x1 :
- for i in range(x2-x1+1):
- bian = huaxian(x2-i,y2-i,x3-i,y3+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if x2 > x3 :
- x4 = x2
- y4 = y2
- x2 = x3
- y2 = y3
- x3 = x4
- y3 = y4
- if x2 != x3 :
- if y3 == y2 :
- if y1 > y2 :
- for i in range(y1-y2+1):
- bian = huaxian(x2+i,y2+i,x3-i,y3+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if y2 > y1 :
- for i in range(y2-y1+1):
- bian = huaxian(x2+i,y2-i,x3-i,y3-i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if x1 == x2 :
- if y2 > y1 :
- for i in range(y2-y1+1):
- bian = huaxian(x1,y1+i,x3-i,y3+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if y1 > y2 :
- for i in range(y1-y2+1):
- print(tuxing)
- bian = huaxian(x1,y1-i,x3-i,y3-i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if x1 == x3 :
- if y3 > y1 :
- for i in range(y3-y1+1):
- bian = huaxian(x2+i,y2+i,x1,y1+i)
- print(x2-i,y2+i,x1,y1+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- if y1 > y3 :
- for i in range(y1-y3+1):
- bian = huaxian(x2+i,y2-i,x1,y1-i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- tuxing.sort()
- for i in range(len(tuxing)) :
- np[tuxing[i]] = (1,2,3)
- np.write()
-
-
-
-
在这里我画了3个
三角形分别是填充和不填充的
接下来就是画方形了
- from machine import Pin
- from neopixel import NeoPixel
- import time
- p5 = Pin(5,Pin.OUT)
- np = NeoPixel(p5,256)
- r = g = b = 0
- tuxing = []
-
-
-
-
-
-
-
-
- def dian(x,y) :
- if x == 1 :
- return 16 - y
- if x == 2 :
- return 15 + y
- if x == 3 :
- return 48 - y
- if x == 4 :
- return 47 + y
- if x == 5 :
- return 80 - y
- if x == 6 :
- return 79 + y
- if x == 7 :
- return 112 - y
- if x == 8 :
- return 111 + y
- if x == 9 :
- return 144 - y
- if x == 10 :
- return 143 + y
- if x == 11 :
- return 176 - y
- if x == 12 :
- return 175 + y
- if x == 13 :
- return 208 - y
- if x == 14 :
- return 207 + y
- if x == 15 :
- return 240 - y
- if x == 16 :
- return 239 + y
-
-
-
- def huaxian(x1,y1,x2,y2) :
- xian = []
- x3 = y3 = 0
- if x1 == x2 :
- if y1 == y2 :
- xian.append(dian(x1,y1))
- if y1 > y2 :
- for i in range(y1-y2+1) :
- xian.append(dian(x1,y2+i))
- if y1 < y2 :
- for i in range(y2-y1+1) :
- xian.append(dian(x1,y1+i))
- if x1 > x2 :
- x3 = x1
- x1 = x2
- x2 = x3
- y3 = y1
- y1 = y2
- y2 = y3
- if x1 != x2 :
- if y1 == y2 :
- for i in range(x2-x1+1) :
- xian.append(dian(x1+i,y1))
- if y1 > y2 :
- if y1 - y2 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1-i))
- if y1 < y2 :
- if y2 - y1 == x2 - x1 :
- for i in range(x2-x1+1):
- xian.append(dian(x1+i,y1+i))
- return xian
-
-
- def fangxing (x1,y1,x2,y2,t=0) :
- global tuxing
- bian = []
- x3 = y3 = 0
-
- if x1 == x2 :
- tuxing = huaxian(x1,y,x2,y2)
- if x1 > x2 :
- x3 = x1
- y3 = y1
- x1 = x2
- y1 = y2
- x2 = x3
- y2 = y3
- if x1 != x2 :
- if y1 == y2 :
- tuxing = huaxian(x1,y,x2,y2)
- if y1 > y2 :
- for i in range(y1-y2+1):
- bian = huaxian(x1,y1-i,x2,y1-i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- if y2 > y1 :
- for i in range(y2-y1+1):
- bian = huaxian(x1,y1+i,x2,y1+i)
- for j in range(len(bian)) :
- tuxing.append(bian[j])
- tuxing = list(set(tuxing))
- tuxing.sort()
- for i in range(len(tuxing)) :
- np[tuxing[i]] = (1,2,3)
- np.write()
画方形
这里画了一个(5,7)(7,13)
今天太累了 有什么提问就在下面留言吧
爱你们呦 回家睡觉了
|