.. _z2-bresenham: ========================== Zadanie 2: Rysowanie linii ========================== Data ogĹoszenia: 10.11.2020 Termin oddania: 08.12.2020 Szablon rozwiÄ zania i testy: :download:`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Ĺu - ``in_ready`` (wyjĹcie): oznacza, Ĺźe moduĹ jest gotowy na przyjÄcie pakietu danych wejĹciowych - gdy 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 pakietu ``NEXT`` - ``NEXT``: 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Ĺ ``NEXT`` po sobie, by narysowaÄ ĹamanÄ - ``in_x`` (wejĹcie, ``width``-bitowe): wspĂłĹrzÄdna X - ``in_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Ĺciowych - ``out_ready`` (wejĹcie): oznacza, Ĺźe odbiorca danych wyjĹciowych jest gotowy na przyjÄ cie pakietu - gdy 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 linii - ``LINE_END``: informacja, Ĺźe rysowanie linii (w odpowiedzi na polecenie ``NEXT``) zostaĹo zakoĹczone - ``out_x`` (wyjĹcie, ``width``-bitowe): wspĂłĹrzÄdna X piksela (nieuĹźywane dla pakietu ``LINE_END``) - ``out_y`` (wyjĹcie, ``width``-bitowe): wspĂłĹrzÄdna Y piksela (nieuĹźywane dla pakietu ``LINE_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)