Disegnare linee su Raspberry Pico Display in MicroPython
Il PicoDisplay per Raspberry PI Pico ha varie primitive per disegnare sul display, ma tra queste manca la possibilità di disegnare delle linee.
La seguente funzione MicroPython permette di disegnare una linea tra un punto A (x1, y1) e un punto B (x2, y2)
La linea viene disegnata implementando l'equazione della retta y = m * x, disegnando ogni singolo punto con la funzione nativa display.pixel(x, y).
Questa è una demo che usa la funzione line per tracciare 3 linee colorate
e questo è il risultato sul display
Le uniche linee che è possibile disegnare nativamente sono quelle orizzontali tramite l'istruzione display.pixel_span(x, y, length).
La seguente funzione MicroPython permette di disegnare una linea tra un punto A (x1, y1) e un punto B (x2, y2)
Python: line(x1, y1, x2, y2)
import picodisplay as display
import math
def line(x1, y1, x2, y2):
if x1 == x2 and y1 == y2:
# punto
display.pixel(x1, y1)
else:
# linea
ox = x1
oy = y1
w = x2 - x1
h = y2 - y1
greaterDx = math.copysign(w, 1) > math.copysign(h, 1)
# calcolo inclinazione linea
m = 1.0
if w != 0:
m = h / w
# disegno linea
if greaterDx:
if x1 > x2:
ox = x2
oy = y2
w = math.copysign(w, 1)
for x in range(w + 1):
nx = ox + x
ny = oy
if h != 0:
ny = oy + (m * x)
display.pixel(int(nx), int(ny))
else:
if y1 > y2:
ox = x2
oy = y2
h = math.copysign(h, 1)
for y in range(h + 1):
nx = ox
if w != 0:
nx = ox + (y / m)
ny = oy + y
display.pixel(int(nx), int(ny))
Richiede la libreria math oltre, naturalmente, alla libreria picodisplay.
Questa è una demo che usa la funzione line per tracciare 3 linee colorate
Python: demo
# serve la funzione 'line' precedente
width = display.get_width()
height = display.get_height()
buffer = bytearray(width * height * 2) # 2-bytes per pixel (RGB565)
display.init(buffer)
display.set_backlight(1.0)
display.set_pen(0, 0, 0)
display.clear()
# linea rossa
display.set_pen(255, 0, 0)
line(100, 100, 50, 50)
# linea verde
display.set_pen(0, 255, 0)
line(100, 100, 150, 60)
# linea blu
display.set_pen(0, 0, 255)
line(150, 60, 210, 100)
display.set_pen(128, 0, 0)
display.text("SGART.IT", 150, 5, 170, 2)
display.update()