Il PicoDisplay per Raspberry PI Pico ha varie primitive per disegnare sul display, ma tra queste manca la possibilità di disegnare delle linee.
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))
La linea viene disegnata implementando l'equazione della retta y = m * x, disegnando ogni singolo punto con la funzione nativa display.pixel(x, y).
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()
e questo è il risultato sul display
demo linee
demo linee
Tags:
Arduino12 Elettronica54 IoT12 Python12 Raspberry PI8
Potrebbe interessarti anche: