i i “Vitek-racunalnik” — 2010/5/13 — 10:03 — page 1 — #1 i i i i i i List za mlade matematike, fizike, astronome in računalnikarje ISSN 0351-6652 Letnik 13 (1985/1986) Številka 1 Strani 38–44 Andrej Vitek: KAKO RAČUNALNIK NARIŠE DALJICO Ključne besede: računalništvo, matematika. Elektronska verzija: http://www.presek.si/13/747-Vitek.pdf c© 1985 Društvo matematikov, fizikov in astronomov Slovenije c© 2010 DMFA – založništvo Vse pravice pridržane. Razmnoževanje ali reproduciranje celote ali posameznih delov brez poprejšnjega dovoljenja založnika ni dovo- ljeno. KAKO RAČUNALNIK NARISE DALJICO Očetje in sinovi, pa tudi kakšna hči in celo mamica so si zadnja leta našli novo igračo: hišni računalnik. Pravo malo čudo je takale škatlica, kajne? Sin se z njo podi za Marsovci, očka piše nekakšne službene zadeve, hčerka odkriva skrivno- sti in zaklade kraških jam, mamica pa si tu in tam ogleda svoj bioritem. In vsa ta resna in manj resna dogajanja spremlja risba na televezijskem zaslonu: črta kaže, kako raste in pada bioritem, po drugi črti potuje marsovska vesoljska ladja. Le kako zna računalnik vse to narisati? Vas zanima? Pa si oglejmo! RAČUNALNIKOV PAPIR Kje bi začeli? Pri samem začetku: oglejmo si, kako računalnik nariše sliko na zaslon. Nekateri med vami vedo, kako sliko riše televizor, drugi se o tem lahko takoj prepričate: prižgite televizor in sliko poglejte čisto od blizu. Opazili boste, da je slika sestavljena iz množice vodoravnih vrstic . Podobno postopa tudi računalnik, le da so pri njem vrstice razdeljene še na barvne ali črno-bele pike, in to tako, da je zaslon velika rešetka različno pobarvanih pik. Pike stoje druga pod drugo, urejene v stolpce. Računalnikove pike so ošteviIčene, zato pač, da lahko pot od pike do pike izračuna. Piko izberemo s parom naravnih števil; prvo število pove stolpec, drugo pa vrstico, v kateri stoji pika. Stolpce in vrstice štejemo od levega spodnjega vogala zaslona. Pika 23,14 je tako triindvaj- seta pika v štirinajsti vrstici. Paru števil, ki označujeta piko, pravimo s tujko koordinati. Tako torej lahko ukažemo: pobarvaj piko 23,14, ali v basicu : PLOT 23,14. Igranje z barvo in podobnimi učinki pa prepuščam vam, dragi bralci. RAČUNALNIKOVO RAVNILO Sedaj pa k stvari: oglejmo si, kakšno je računalnikevo ravnilo, po kakšnem po- stopku računalnik nariše ravno črto. Denimo od točke 23,14 do točke 47,28, se pravi 24 pik v desno in 14 navzgor. Nekateri med vami me boste na kratko odpravili: z ukazom DRAW 24,14 pač, boste rekli. Res je, dosti računalnikov 38 je, ki "znajo" risati ravne črte, pri katerih je postopek za risanje vgrajen kar v računalnik sam. Pa vam utegne priti postopek za risanje ravne črte prav tudi na takem računalniku. Kdaj? Denimo, ko boste v svoji igrici želeli vesoljsko ladjo poslati z enega planeta na drugega - po ravni črti. A več o tem morda kdaj drugič . Z vez n i c El • ti GI e Crt El , ki j o nElr ise r e c o n e t n l k + + 4 7, 2 8 + + 1 4 23 ,14 Slika 1. Skica naše naloge 2 4 , v 2 3. 1 4 Slika 2. Podobni trikotniki 2 4 pr e se t isce 24 24 .1 4 14 47 , 2 8 39 Preden se naloge lotimo, si jo skicirajmo. Na sliko 1 smo narisali kar naš gornji primer, črto od 23,14 do 47,28. Ti piki povezuje črta, potegnjena s pravim ravnilom. Z računalnikom bomo morali pobarvati tudi pike, katerih središča ne leže na tej črti. Črta, ki jo nariše računalnik, zato ni ravna, temveč žagasta. Lotimo se torej naloge! Piko za piko moramo pobarvati, drugo za drugo. Seveda moramo pobarvati začetno piko, naslednjo pa določiti nekje v smeri proti končni. Najlaže je določiti tisto, katere središče je najbliže točki, v kateri prava črta, to je zveznica začetne in končne točke, prečka sredino sosednjega stolpca . Prestavimo se torej v sosednji stolpec, poglejmo, kje ta stolpec prečka zveznica obeh točk. To nam povesta podobna trikotnika s slike 2. Iz enačbe podobnosti 14:24 = d : 1 takoj izračunamo, koliko nad osnovnico trikotnika je preseči šče, od tod pa dob imo njegovo višino v: d = 14/24 v = 14 +d Kako določimo presečišču najbližjo piko? Višino presečišča zaokrožimo , po- iščemo ji najbližje celo število. V gornjem primeru moramo torej pobarvati pi- ko z višino 15. Povsem podobno izračunamo presečišče zveznice z naslednjim stolpcem. Sami premislite, kako bi potrdili, da je vsako naslednje presečiš če za d više! Označimo z i, j koordinati pike, ki jo pobarvamo. Zgornji razmislek po- tem uredimo v tale postopek: (1) postavi se v začetno piko: i := 23,j := 14, postavi v := 14 (saj je v tem stolpcu presečišče kar prva pika), izračunaj d := 14/24; (2) pobarvaj trenutno piko, če je to zadnja pika, končaj; (3) izra čunal višino naslednjega presečišča : v := v + d, izračune] koordinati nove pike : i := i + 1, j := zaokrožen v, pojdi na (2); Program v basicu hočete? Samo en oreh še stremo, pa ga zapišemo: naučiti se moramo zaokroževati. Kot vemo, zaokrožimo decimaino število, ki leži med celima številoma k in k + 1, na k, če je manjše od k+1/2 , sicer pa na k + 1. Naj nam zato c označuje razliko med višino presečišča in prvim za pol zmanjšanim celim številom pod njim. Višina začetne pike je celo število, zato je začetna 40 vrednost c kar 1/2. Ko se preselimo v sosednjo piko, se c poveča za d. Pri tem lahko seveda spleza nad 1, tedaj pač, ko v zraste čez naslednje, za pol zvečano celo število. V tem primeru moramo višino pobarvane pike zvečati za 1, zato pa c odštejemo 1. Ozrimo se nazaj, pa lahko hitro ugotovimo, da v sploh ne potre- bujemo več , zadostujeta nam j in c. Pa zapišimo sedaj program! Na primer takole (zaradi čitljivosti smo ga zapisali malo po svoje): 100 LET i = 23: LET J = 14: LET c=1/2: LET d = (47-23)/(28-14) Nasmehnili ste se: davno ste se že naučili, da je 47-23 = 24. Res je, vendar nam zapis pokaže pot v posplošitev programa. Saj hočemo s črto zvezati polju- ben par točk, kajne? Denimo začetno točko s koordinatama iz, jz s končno točko, katere koordinati zapišimo z ik, jk. Takoj popravimo ta korak progra- ma, pa je program takle: 100 INPUT "Začetna točka", iz, jz: INPUT "Končna točka" , ik, jk: 200 LET i = iz : LET j = jz : LET c= 1/2: LET d = (jk-jz)/(ik-iz) Nadaljujmo: pobarvati je treba piko in preveriti, če smo na koncu črte: 300 PLOT i, j : rF i = ik AND j = jk THEN STOP nato pa določiti koordinati nove pike : 400 LET i O= i+l: LET c=c +d : IFc>lTHEN LET j = j + 1: LET c = c - 1 500 GO TO 300 41 Ste program nat ipka li? Poigrajmo se malo z njim! Poženimo ga in vtipkajmo gornje podatke: 23, 14 pa 47 in 28. Pri vtipkavanju števila ločite med sabo s pr it isko m tipke ENTER. Program lepo na riše črto in konča . Krasno, si misli- mo, čas je, da ga posnamemo na kaseto. Pa malo dodatnega igranja - "testiranja" - nič ne škoduje. Kar poskusi- mo! Poženimo program ponovno, pri tem pa zamenjajmo začetno in končno točko! Ste videli? Program je odpovedal. Poskusimo še enkrat, tokrat zamenjaj- mo le stolpce z vrsticami, torej: 14 ,23,28,47. Tudi tokrat program povsem zgreši končno točko. Karkoli poskušamo , program riše povsem pravilno le v desno navzgor, in še to le, ko črta ne raste prehitro, ko je razlika vrstičnih šte- vilk manjša od razlike stolpčnih številk. Dopolnimo program, naučimo ga risati še v ostalih smereh! Zato si še enkrat oglejmo, kako izberemo novo piko za barvanje. O tem odloča ostanek c: če je manjši od 1, se pomaknemo vodoravno v desno, sicer pa poševno v desno navzgor. Izbiramo torej le med prvo in drugo sosedo pobarvane pike (slika 3). Program moramo torej popraviti tako, da bo znal izbirati še med preostalimi sosedami. Med katerimi? Odgovor razberemo iz slike : pri vsaki od črt bomo sosedo izbrali med tistima, med katerima pelje narisana črta. Do ene od obeh pridemo pošev, do druge pa vodoravno ali navpično . Poglejmo , kako bi ta kora- ka i zračuna l i ! Označimo poševni korak s pi, pi, pa takoj uganemo: pi = predznak (ik-iz) pj = predznak (jk-jz) Funkcije predznak se seveda ne ustrašimo, tud i v basicu smo jo že srečali : SGN ji je bilo ime. Le ponovimo, da je predznak pozitivneg-aštevila enak 1, negativ - nega -1, pri O pa je enak O. Lotimo se sedaj še drugega koraka, označimo ga z di , dj! Korak bo vodoraven ali navpičen; zato bo eden od di ali dj enak O, dru- II Slika 3. Sosed ne pike 42 O, 1-1,1+ + +1.1 -1,0+ ~_ + 1.0 -1.-1+ + + 1, -1 o•- 1 gi pa tak kot pi oziroma p] . Kateri? Tud i tu se ne zamudimo kaj dl je : če je velikost razlike vrstic večj a od veli kosti razlike stolpcev za četne in končne točke, bo treba kor akati navpik, sicer vodoravno. Veli kost števil a nam v basicu i zračun a funkcija ABS (absolutna vrednost ) . Sedaj premislimo še, kako se bomo odloči li med obema ko rakom a. Spet bo sodilo c. Kadar bomo izbirali med vodoravnim in poševnim korakom, nam bo povedal , kdaj moramo spremeniti vrstično št evilko-ko se bomo odločali med poševnim in navpičnim, pa bo odločil, kdaj spremenimo stolpčno števi- lko pike,ki jo bomo pobarva li. Pomen c bo v obeh primerih podoben kot zgo- raj: ko bo njegova vrednost zrasla nad ena, bomo izbrali poševni, sicer pa vodo - ravni oziroma navpični korak. Od pike do pike bo c spet naraščal s korakom d. Dopolnimo sedaj s temi ugotovitvami postopek za risanje: (1) preberi koordinate začetne in končne točke: iz, [z , ik,jk; (2) izber i sosedi in določi koraka do njiju : pi := predznak (ik-iz) , pj := predznak (j k-jz) , di := pi, dj := pi, če je velikost lik-iz) večja od velikosti (jk-jz) potem postavi dj := Osicer pa di := O; (3) izračune] korak sodila c: c := 1/2, če je velikost (ik-iz) večja od velikosti (jk-jz) potem postavi d := velikost ((jk-jz)/lik-iz)) sicer pa d := velikost ((ik-iz) / (jk-jz)); (4) postavi sev začetno piko : i := iz , j := jz, (5) pobarvaj trenutno piko , če je to zadnja pika, končaj; (6) iz rač une] vrednosti sodila v sosednjem stolpcu : c:= c +d; če je c večji kot 1 potem izber i poševni korak: i := i + pi, j := j + pj ter zmanjšaj c: c := c - 1 sicer pa vodoravni oziroma navpični korak : i := i +di, j := j + pi, pojd i na (5) ; Na koncu zapišimo še program . Dopolnili smo ga toliko , da smo se znebili decimalnih števil : vsa števila , s katerimi računamo, so sedaj cela. Kako? Vrednost d in c smo pomnožil i zimenovalcem d in z 2, temu smo ustrezno spremenili tudi vrednost 1 v primerjavi iz koraka (6). 43 100 INPUT · Zacetna to cka " ' li ~::.t o lp(.": lc :::: n ~ i :i: ,.. n ........ ( ' ~::. t .i c: t.), :::: l1 :; .j z :1.10 lNPU'r "l-':': on c: n ii toc:I<,,\ "" " ~ ::. t o l P E' C: ;:,: " ~:i, k " Il v r" i::.t ; :i. c ii ::" ";:.j k 2 0 0 LET r i = i k -i z ~ L..E~ ·r p .:.i:;:: .;j k· ···.:.i z ~ LET p i=SGN r i ~ LET di=pi~ LE'r p.j=SGN r.j; LET dj=pj: LET ''' :i.'";j::',X<:) '''':i. '' LE'r 1'" j ::::iYbS j.., ,.,i 2 10 IF ri