Zadanie 2: Rysowanie linii¶
Data ogłoszenia: 10.11.2020
Termin oddania: 08.12.2020
Szablon rozwiązania i testy: bresenham_template.py
Napisać moduł implementujący algorytm rysowania linii Bresenhama.
Moduł powinien mieć dwa interfejsy: interfejs wejściowy, na którym odbiera współrzędne końców linii, oraz interfejs wyjściowy, na którym wysyła współrzędne pikseli należących do linii oraz informację o zakończeniu rysowania linii.
Moduł powinien być parametryzowany parametrem width, określającym
rozmiar współrzędnych pikseli w bitach.
Interfejs wejściowy ma następujące sygnały:
in_valid(wejście): oznacza, że dostępny jest pakiet danych wejściowych dla modułuin_ready(wyjście): oznacza, że moduł jest gotowy na przyjęcie pakietu danych wejściowychgdy oba powyższe sygnały są jednocześnie aktywne, następuje transfer pakietu wejściowego na następujących sygnałach:
in_type(wejście): typ pakietu, jeden z:FIRST: ustawia współrzędne pierwszego końca linii; powinien być wysłany przed wysłaniem pierwszego pakietuNEXTNEXT: podaje współrzędne drugiego końca linii i rysuje linię, powodując emisję odpowiednich pakietów na interfejsie wyjściowym; pierwszy koniec linii był podany w poprzednim pakiecie wejściowym — w szczególności, można wysłać kilka poleceńNEXTpo sobie, by narysować łamaną
in_x(wejście,width-bitowe): współrzędna Xin_y(wejście,width-bitowe): współrzędna Y
Interfejs wyjściowy ma następujące sygnały:
out_valid(wyjście): oznacza, że moduł ma gotowy pakiet danych wyjściowychout_ready(wejście): oznacza, że odbiorca danych wyjściowych jest gotowy na przyjącie pakietugdy oba powyższe sygnały są jednocześnie aktywne, następuje transfer pakietu wyjściowego na następujących sygnałach:
out_type(wejście): typ pakietu, jeden z:PIXEL: współrzędne jednego z pikseli należących do liniiLINE_END: informacja, że rysowanie linii (w odpowiedzi na polecenieNEXT) zostało zakończone
out_x(wyjście,width-bitowe): współrzędna X piksela (nieużywane dla pakietuLINE_END)out_y(wyjście,width-bitowe): współrzędna Y piksela (nieużywane dla pakietuLINE_END)
Moduł powinien implementować następujący pseudokod:
while True:
(type, x, y) = in.recv()
if type == FIRST:
cur_x = x
cur_y = y
else: # type == NEXT
dst_x = x
dst_y = y
# Algorytm Bresenhama.
dx = abs(cur_x - dst_x)
dy = abs(cur_y - dst_y)
sx = 1 if dst_x > cur_x else -1
sy = 1 if dst_y > cur_y else -1
err = dx - dy
while (cur_x, cur_y) != (dst_x, dst_y):
out.send(PIXEL, cur_x, cur_y)
e2 = err * 2
if e2 >= -dy:
err -= dy
cur_x += sx
if e2 <= dx:
err += dx
cur_y += sy
out.send(LINE_END)