5. Kruznica

   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 
slucka push af 
 ld bc,#6080 
 call circle 
 pop af 
 add a,#03 
 cp #60 
 jr c,slucka 
 ret  
   
circle ld d,a 
 or 
 jp z,bod 
 inc 
 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 
 ld e,a 
 ld a,d 
 add a,b 
 ld b,a 
 push de 
 call bod 
 pop de 
 ld a,b 
 sub 
 sub 
 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 
 sub 
 ld c,a 
 call bod 
 ld d,#00 
 ld h,d 
 ld l,d 
 ld e,xl 
 ld ix,#ff 
e130 inc 
 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 
 ld b,a 
 ld c,e 
 sbc hl,bc 
 pop hl 
 jr c,e130 
   
 ld b,#00 
 ld c,e 
 sbc hl,bc 
 dec 
 push hl 
 call eelin 
 pop hl 
 ld xl,d 
 xor 
 xor xh 
 jr z,e130 
 ret  
   
eelin inc xl 
 ld a,xl 
 cp 
 jr z,eeln1 
 ld a,e 
 cp 
 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 
 ld b,a 
 call ccnn1 
 pop ix 
 pop de 
 ld a,d 
 cp 
 jr nz,eeln2 
 cp xl 
 ret 
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 
 ld c,a 
 call ccnn2 
 pop ix 
 pop de 
 ret  
   
ccnn1 push bc 
 push de 
 ld a,c 
 sub 
 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 
 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.

Nazad / back , predchadzajuca lekcia