Taaak, dufam ze uz mate nachystane kruzidla a ze sa mozeme pustit
do prace. Len prosim vas nekreslite kruznice na obrazovke monitora
alebo televizora kruzidlom - jednak do obrazovky sa dost zle zapichuje
hrot kruzidla a jednak takto nakreslena kruznica sa pomerne tazko
maze prikazom CLS. Radsej podme namiesto kruzidla pouzit procesor,
nech nam on sam kresli kruznice.
To, ze sme si minule ukazali rutinky na kreslenie vodorovnych a zvislych
ciar vobec nie je nahoda. Dnes ich s velkou vyhodou pouzijeme pri kresleni
kruznic. Pytate sa, ze ako sa vobec daju pouzit vodorovne a zvisle ciary
na kreslenie oblych utvarov ? Jednak na ZX Spektre je vsetko mozne a jednak
pri blizsom pohlade tie oble utvary ani zdaleka nie su az take oble.
Skuste si nakreslit kruznicu v basicu, napr. CIRCLE 128,86,86 a vsimnite
si uplne hornu cast. Je tvorena krasnym rovnym usekom. Ako postupne
idete po kruznici, po skonceni tohto rovneho useku nasleduje dalsi
rovny usek, ktory ale lezi o jeden bod nizsie a je kratsi. A ked idete
takto dalej a dalej, zistite, ze kazdy dalsi vodorovny usek je kratsi
a kratsi, az po prejdeni osminy kruhu je nas vodorovny usek tvoreny
prave jednym bodom. A zrazu sa situacia obrati - objavuju sa zvisle
useky stale vecsej a vecsej dlzky a najdlsie su uplne vlavo alebo vpravo.
Co keby sme na kreslenie tychto vodorovnych a zvislych usekov pouzili
rutinky "rovno" a "zvislo" z minulej casti ?
Pre tych z vas, ktori to nevidite alebo nemate dostatocne
ostry obraz skuste po resete, ked mate nastaveny PAPER 7, INK 0
nakreslit CIRCLE PAPER 0,128,86,86 a urcite to zbadate.
Dalsiu zaujimavost, ktoru si mozete vsimnut, je krasna sumernost kruznice.
Nebojte sa, nebudem tu teraz pisat rozne umelecke eposy o tejto geometrickej
vlastnosti, namiesto toho vasu pozornost upriamim na sumernost kruznice
ktora je nakreslena na obrazovke pocitaca. Idealna geometricka kruznica
ma nekonecne mnozstvo osi sumernosti, avsak nasa kruznica z pocitaca
uz nedisponuje takym mnozstvom osi - ma ich len styri. Tieto styri osi
ju rozdeluju na osem rovnakych usekov. Tato skutocnost sa da tiez velmi
pekne zneuzit (o, pardon, vyuzit) v nas prospech. Pri kresleni nam
staci pocitat len jeden takyto usek a vsetky ostatne budu take
iste, akurat zozrkadlene okolo uz spominanych osi sumernosti.
Nasa rutinka "circle" potrebuje na vstupe suradnice stredu v registri BC
(B=Y,C=X) a polomer kruznice v registri A. Pri svojej cinnosti vola
rutinky "bod", "rovno" a "zvislo", ktore sme uviedli v minulych castiach.
Rutinka najprv nakresli styri body - priesecniky kruznice s jej vodorovnou
a zvislou osou sumernosti, potom postupne od tychto bodov odvija kazdy
z osmych rovnakych usekov kruznice az sa tieto useky "stretnu"
v priesecnikoch kruznice s jej sikmymi osami sumernosti.
run | call | mkbod |
xor | a | |
slucka | push | af |
ld | bc,#6080 | |
call | circle | |
pop | af | |
add | a,#03 | |
cp | #60 | |
jr | c,slucka | |
ret | ||
circle | ld | d,a |
or | a | |
jp | z,bod | |
inc | a | |
ld | h,b | |
ld | l,c | |
ld | (xy14+1),hl | |
ld | (xy15+1),hl | |
ld | (xy16+1),hl | |
ld | (xy17+1),hl | |
ld | xl,a | |
dec | a | |
ld | e,a | |
ld | a,d | |
add | a,b | |
ld | b,a | |
push | de | |
call | bod | |
pop | de | |
ld | a,b | |
sub | d | |
sub | d | |
ld | b,a | |
push | de | |
call | bod | |
pop | de | |
ld | a,b | |
add | a,d | |
ld | b,a | |
ld | a,c | |
add | a,e | |
ld | c,a | |
push | de | |
call | bod | |
pop | de | |
ld | a,c | |
sub | e | |
sub | e | |
ld | c,a | |
call | bod | |
ld | d,#00 | |
ld | h,d | |
ld | l,d | |
ld | e,xl | |
ld | ix,#ff | |
e130 | inc | d |
ld | c,d | |
ld | b,#00 | |
add | hl,bc | |
ld | a,h | |
add | a,a | |
jr | nz,e130 | |
push | hl | |
add | hl,hl | |
add | hl,hl | |
xor | a | |
ld | b,a | |
ld | c,e | |
sbc | hl,bc | |
pop | hl | |
jr | c,e130 | |
ld | b,#00 | |
ld | c,e | |
sbc | hl,bc | |
dec | e | |
push | hl | |
call | eelin | |
pop | hl | |
ld | xl,d | |
xor | a | |
xor | xh | |
jr | z,e130 | |
ret | ||
eelin | inc | xl |
ld | a,xl | |
cp | e | |
jr | z,eeln1 | |
ld | a,e | |
cp | d | |
jr | nc,eeln1 | |
ld | xh,d | |
ret | ||
eeln1 | push | de |
push | ix | |
xy14 | ld | bc,#5555 |
ld | a,b | |
add | a,e | |
ld | b,a | |
push | de | |
call | ccnn1 | |
pop | de | |
xy15 | ld | bc,#5555 |
ld | a,b | |
sub | e | |
ld | b,a | |
call | ccnn1 | |
pop | ix | |
pop | de | |
ld | a,d | |
cp | e | |
jr | nz,eeln2 | |
cp | xl | |
ret | z | |
eeln2 | push | de |
push | ix | |
xy16 | ld | bc,#5555 |
ld | a,c | |
add | a,e | |
ld | c,a | |
push | de | |
call | ccnn2 | |
pop | de | |
xy17 | ld | bc,#5555 |
ld | a,c | |
sub | e | |
ld | c,a | |
call | ccnn2 | |
pop | ix | |
pop | de | |
ret | ||
ccnn1 | push | bc |
push | de | |
ld | a,c | |
sub | d | |
ex | af,af | |
ld | a,c | |
sub | xl | |
ld | d,a | |
ex | af,af | |
ld | c,a | |
call | rovno | |
pop | de | |
pop | bc | |
ld | a,c | |
add | a,d | |
ld | d,a | |
ld | a,c | |
add | a,xl | |
ld | c,a | |
jp | rovno | |
ccnn2 | push | bc |
push | de | |
ld | a,b | |
sub | d | |
ex | af,af | |
ld | a,b | |
sub | xl | |
ld | d,a | |
ex | af,af | |
ld | b,a | |
call | zvislo | |
pop | de | |
pop | bc | |
ld | a,b | |
add | a,d | |
ld | d,a | |
ld | a,b | |
add | a,xl | |
ld | b,a | |
jp | zvislo |
Pri prvom pohlade na tuto rutinku vas asi napadne: Co su tam za cisla #5555 pri navestiach xy14 az xy17 ? Odpoved je velmi jednoducha: vsimnimte si hned na zaciatku rutinky instrukcie ld (xy14+1),hl az ld (xu17+1),hl. Tieto instrukcie ulozia do instrukcii ld bc,cislo na navestiach xy14 az xy17 suradnice stredu kruznice. Preto je uplne jedno ake cislo sa vklada do registra BC v zdrojovom texte, pri samotnom behu programu sa aj tak toto cislo zmeni podla aktualnej situacie.
Vas Busy.