Programowanie: Rysowanie linii
From Atariki
Draw dla trybu lowres (Graphics 15) 160x192 rysujący linię o długości 50 pikseli w pionie od pozycji (x,0) o kącie nachylenia z zakresu [-45;45] stopni:
COLOR = 1 ;kolor z zakresu 0,1,2,3 org $80 dx .ds 2 tmp .ds 1 ;A = x, X = alpha (U2 - $c0=-45..0=0..$40=45) draw: ldy #0 sty tmp cpx #$80 ;rozszerzenie alpha na 16 bit scc dey stx dx sty dx+1 lsr ;obliczenie pozycji punktu w linii ror tmp lsr ror tmp tay ldx tmp .rept 49 lda screen+40*#,y and bytemask,x ora bytepxl,x sta screen+40*#,y txa adc dx tax tya adc dx+1 tay .endr lda screen+40*49,y and bytemask,x ora bytepxl,x sta screen+40*49,y rts bytemask: :256 .byte ~(%11 << (6 - ((# / 64) * 2))) bytepxl: :256 .byte COLOR << (6 - ((# / 64) * 2))
Algorytm wykorzystuje właściwość funkcji liniowej y=ax+b określającą współczynnik kierunkowy a prostej, jako a=tg(alpha) kąta odchylenia prostej od pionu - określa on poziomy przyrost dx o jaki z każdym krokiem odchylana jest prosta.
Ponieważ można założyć, że w zakresie [-45;45] stopni a=tg(alpha) jest w przybliżeniu funkcją liniową, dlatego zrezygnowano z obliczania funkcji na rzecz wartości a podawanej bezpośrednio do procedury draw (kąt alpha w zakresie [-45;45] stopni jest mapowany na współczynnik kierunkowy a w zakresie [-$40;$40]).
Rejestry YX w pętli zawierają pozycję x piksela, modyfikowaną o przyrost dx. Jest to liczba z 6 bitami części ułamkowej (najmłodsze bity rejestru X) i 2 bitami wskazującymi na pozycję piksela w bajcie (dwa najstarsze bity rejestru X mapowane na konkretne maski przez tablice bytemask i bytepxl). Rejestr Y zawiera pozycję bajtu w linii ekranowej.
Algorytm zaniedbuje błędy wynikające z małej rozdzielczości części ułamkowej pozycji x piksela (ma ona rozmiar 6 bitów), ponieważ jest ona wystarczająca do rysowania linii o długości mniejszej niż 26=64 pikseli.
Dodatkowo błędy mogące wynikać z niewielkiej rozdzielczości współczynnika kierunkowego (alpha) odcinka w zakresie [-45;45] stopni są w przypadku tak krótkiej linii pomijalne.