Programowanie: Rysowanie linii
From Atariki
Wersja z dnia 00:35, 11 gru 2016 Mono (Dyskusja | wkład) (sdp) ← Previous diff |
Wersja z dnia 00:38, 11 gru 2016 Mono (Dyskusja | wkład) (bledy wspolczynnika kierunkowego) Next diff → |
||
Linia 53: | Linia 53: | ||
Algorytm pomija błędy wynikające z akumulacji znacznika C w części ułamkowej pozycji piksela, ponieważ ma ona rozmiar 6 bitów (64 możliwe wartości) i przy rysowaniu 50 pikseli błąd się nie ujawni. | Algorytm pomija błędy wynikające z akumulacji znacznika C w części ułamkowej pozycji piksela, ponieważ ma ona rozmiar 6 bitów (64 możliwe wartości) i przy rysowaniu 50 pikseli błąd się nie ujawni. | ||
+ | |||
+ | 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. | ||
[[Kategoria:Niezbędnik kodera]] | [[Kategoria:Niezbędnik kodera]] |
Wersja z dnia 00:38, 11 gru 2016
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:
org $80 COLOR = 1 ;kolor z zakresu 0,1,2,3 dx .ds 2 tmp .ds 1 ;A = x, X = alpha (U2 - $c0=-45..0=0..$40=45) draw: ldy #0 sty tmp lsr ror tmp lsr ror tmp stx dx cpx #$80 scc dey ldx tmp sty dx+1 tay .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))
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 dwoma 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 pomija błędy wynikające z akumulacji znacznika C w części ułamkowej pozycji piksela, ponieważ ma ona rozmiar 6 bitów (64 możliwe wartości) i przy rysowaniu 50 pikseli błąd się nie ujawni.
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.