Programowanie: Rysowanie linii

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
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.

Personal tools