P K I- S I- K List za mlade matematike, fizike, astronome in računalnikarje ISSN 0351-6652 Letnik 18 (1990/1991) Številka 1 Strani 56-64, III, IV Ciril Pezdir: NENAVADNE KRIVULJE Ključne besede: računalništvo, matematika, krivulje. Elektronska verzija: http://www.presek.si/18/1023-Pezdir.pdf © 1990 Društvo matematikov, fizikov in astronomov Slovenije © 2010 DMFA - založništvo Vse pravice pridržane. Razmnoževanje ali reproduciranje celote ali posameznih delov brez poprejšnjega dovoljenja založnika ni dovoljeno. mMHiiwm D i ¡SU NENAVADNE KRIVULJE Najprej si bomo ogledali nekaj znanih krivulj in o vsaki povedali kaj zanimivega. Potem se bomo seznanili z enostavnim načinom generiranja vseh teh krivulj. Napisali pa bomo tudi program, s katerim bomo lahko vse te krivulje risali in si izmišljali svoje. 1. Kochova snežinka Začnimo z enakostraničnim trikotnikom (slika la). V prvem koraku razdelimo vsako stranico trikotnika na tretjine, srednje odseke stranic pa nadomestimo z novimi, za tretjino manjšimi enakostraničnimi trikotniki (slika lb). V drugem koraku naredimo enako z vsako od stranic tako dobljenega poligona, ki spominja na Davidovo zvezdo. Postopek lahko ponavljamo, dokler nam to dopušča natančnost risanja. Če po nekaj korakih postopka lahko približno vidimo, kakšen bo izgled krivulje, obris lika, če bi postopek izvedli neskončnokrat (slika le, glej 4. stran ovitka). Krivulja, ki jo dobimo, če postopek izvedemo neskončnokrat, se imenuje Kochova snežinka, saj je podobna pravi sneïinki. Prvi jo je raziskoval v začetku tega stoletja Helge von Koch. Zelo je zanimiva, saj ima neskončno velik obseg, pa vendar obsega končno površino. Komur so domača geometrijska zaporedja, mu obsega in površine ne bo težko izračunati. Poglejmo, kakšen lik dobimo, če srednje dele stranic nadomeščamo s trikotniki obrnjenimi navznoter (slike 2a do 2e). Obseg lika, če postopek ponovimo neskončnokrat, je enak obsegu Kochove snežinke, površina lika pa je manjša od površine začetnega trikotnika za toliko, kot je površina Kochove snežinke večja od površine istega začetnega trikotnika. Imenujmo ta lik obratna Kochova snežinka. Ravnino lahko popolnoma prekrijemo z izmenja joči ma se likoma Kochove snežinkam obratne Kochove snežinke (slika 3. glej 4. stran ovitka). 2. Peanova krivulja Peanovo krivuljo dobimo z naslednjim postopkom, V prvem koraku kvadratu narišemo diagonalo (slika 4a), V drugem koraku kvadrat razdelimo na devet enakih kvadratov in sedaj njim narišemo vse diagonale z eno potezo, tako da nikjer ne sekamo svoje poti (slika 4b). V tretjem koraku naredimo enako z vsakim od manjših kvadratov (slika 4c). Ker se na slikah 4 diagonale kvadratov v kotih stikajo, ni jasno, kako krivuljo narišemo. Jasno pa bo. Če zavoje krivulje zaoblimo (slika 4cc), Krivulja, ki jo dobimo, če postopek ponovimo neskončnokrat, se imenuje Peanova krivulja. Opazimo, da se krivulja z vsakim naslednjim korakom vedno bolj gosto vije po površini, omejeni s kvadratom. Peanova krivulja je prostor zapolnjujoča krivulja, kar pomeni, da gre skozi vsako točko površine, omejene s kvadratom. To krivuljo je v drugi polovici prejšnjega stoletja odkril italijanski matematik in logik Giuseppe Peano (glej 3, stran ovitka). LTL 3. Zmajev3 krivulja Zmajevo krivuljo lahko le za 0j nekaj prvih korakov razvoja dobimo s prepogibanjem papirja. Vzemimo b ^ dolg papirnati trak, ki predstavlja začetek razvoja zmajeve krivulje (slika 5a). Trak prepognimo po polovici in odprimo do pravega kota (slika 5b). Trak potem dvakrat zaporedoma prepognimo po polovici c) in ga odprimo do pravih kotov (slika 5c). trak trikrat zaporedoma prepognimo po polovici... Kdor ima izkušnje s prepogibanjeni papirja ve,| da se papir ne da prepogniti več kot sedemkrat, pa naj bo še tako tanek in dolg. Naj bo papir na začetku še tako dolg, je prostor, ki ga zaseda zmajeva krivulja, po vsakem koraku manjši. Vendar pa je zmajeva krivulja, dobljena z neskončno mnogo prepogibanj, prostor zapolnjujoča krivulja, če na vsakem koraku dolžino papirja ustrezno podaljšamo. Če želimo, da je razdalja med začetkom in koncem zmajeve krivulje na vsakem koraku enaka, moramo krivuljo na vsakem koraku podaljšati za V^-krat. Štiri zmajeve krivulje iahko lepo zložimo skupaj, kot prikazuje slika 6 na 3, strani ovitka. Slika 5 Prvi je zmajevo krivuljo opisal fizik John E. Heighway leta 1%0 in po njem krivuljo imenujemo tudi Hcighwayev zmaj. f b) Začnemo z daljico (slika 7a), potem pa v vsakem naslednjem koraku vsako daljico zamenjamo z likom (slika 7b). ki je sestavljen iz osmih za tretjino krajših daljic. Če postopek ponovimo neskontnokrat, dobimo krivuljo 2 imenom Sicrpin-skijeva preproga. Sierpinskijeva pre-\ proga ni prostor zapolnjujoča krivulja. Vsota površin vseh 'lukenj' v preprogi je enaka najmanjši površini kvadrata, ki jo potrebujemo, da vanj vrišemo krivuljo. Torej sama krivulja ne prekrije nobene površine. 5. Hiibertova krivulja Osnovni element te krivulje je lik na sliki 8a. V prvem koraku uporabimo štiri osnovne elemente in jih povežemo med seboj s tremi daljicami. kot prikazuje slika 8b Za vsak naslednji korak uporabimo zadnjo dobljeno sliko kot osnovni element, Krivulja, ki jo dobimo po neskončno mnogo korakih, se imenuje Hiibertova krivulja in je prostor zapolnjujoča krivulja. RISANJE KRIVULJ Z risanjem teh krivulj je podobno kot z risanjem premice, trikotnika. kroga,... Vse kar narišemo, pa naj bo še tako natančno, je le približek, pripomoček za nazorno predstavo ideje. Vsaka črta. ki jo narišemo. ima neko debelino, končno dolžino in tudi popolnoma ravna ni. Vse zgoraj opisane krivulje so dobljene s postopkom deljenja, ponovljenim neskončnokrat. Mi bomo risali le krivulje na začetnih stopnjah njihovega razvoja. Generiranje krivulj si oglejmo kar na primeru Kochove snežinke, ki je zelo enostavna. Kateri so osnovni elementi potrebni za risanje Kochove snežinke? To je Šest vektorjev določene dolžine, ki jih bomo oštevilčili od 0 do 5, kot prikazuje slika 9. Krivuljo, ki je sestavljena iz Slika 8 o) b) O d) QJ~Ln ¡_n teh vektorjev, lahko sedaj opišemo z nizom vektorjev. Npr,: niz 024 predstavlja enakostraničen trikotnik (slika la), niz 051021324354 pa Kochovo snežinko na prvi stopnji razvoja (slika lb). Videli smo. da se na vsakem naslednjem koraku vse stranice poligona nadomestijo z likom, sestavljenim \z štirih za tretjino krajših daljic. To lahko opišemo z naslednjimi pravili: vektor 0 se nadomesti z nizom vektorjev 0510, vektor 1 se nadomesti z nizom vektorjev 1021,... Podajmo ta pravila v tabeli: celica nadaljn 0 0 5 1 0 1 10 2 1 2 2 13 2 3 3 2 4 3 4 4 3 5 4 5 5 4 0 5 C 0 2 4 V prvem stolpcu so celice. Vsaka celica ima svoje ime, to je število. V zadnjem stolpcu je podana grafična predstavitev, interpretacija celic. Celicam 0 do 5 smo priredili vektorje s stike 9, celica 6 pa nima nobene grafične predstavitve in smo jo označili z -i. V srednjem delu tabele, imenovanem nadaljnje delitve, pa so podani nizi cclic. ki nadomestijo celico v naslednjem koraku. Celico, ki jo vzamemo kot začetno in iz nje potem v itadaljnih korakih razvijamo krivuljo v skladu s pravili v tabeli imenujemo rojstno celico. Na sliki 10 je predstavljen razvoj celice 6. Generacija označuje, kolikokrat celice nadomestimo z njim ustreznimi nizi cclic. Oglejmo si sedaj program {str. 61) za risanje krivulj, ki so predstavljene s tabelo. Program je napisan v turbo pascalu, ne bo pa ga težko prilagoditi za katerikoli prevajalnik na drugem računalniku, ki omogoča risanje. Ko program poženemo, vpišemo število smeri, t.j. vektorjev, ki so potrebni za risanje krivulje. Pri Kocliovi snežinki je to število 6. Potem vpisujemo nadaljne delitve celic in za vsako celico niz končamo z -1. Za vsakim nizom nadaljnih delitev vnesemo še predstavitev ceiice. Vpisovanje v tabelo končamo z dvema -1. prvič ob prvi nadaljni delitvi celice, ki je ne potrebujemo več. in drugič ob predstavitvi te celice. Po vnosu osnovnih podatkov krivulje v zanki spreminjamo naslednje parametre: dolžino celice, rojstno celico, generacijo in koordinati začetka program G en «r i ran J «_Fr akt a lov; na«« Crt,Graph, var nadaljneDelitve:array[0..50,0, . 50] of iat«g«r; predstavitev: array [0. . 50] of int«g«r: stSm«ri. dolrinaC«lic«,ganeracij a,raj«tnaCelic«,iaceteklrzac«takY,i,j: integer; grDriv«r,grMod«:integer; ch:char; procedur« n«risi(c«liea:integer); var dx.dy:integer; begin if predatavltav[c«lica]>=0 than begin Ax,-round(ioliinaC«lic**cos(pradstavitav[c«lical 20d atSm«ri*2*Pi/itSmari)) ; dy;=-round(do 1naCelice*sin(pre datavitev[eelica]mod ■ tSmari»2*Pi/ilSmtri)) . if (pradatavitevtcalica]>=0)and(pr«datavit«v[c«lical=0 do begin kriu-ulj aCganer aci j a-1, nadalj neDelitva [celica,i]) ; end} { while > and; i ela« } end; { krivulja > begin { glavni } ClrSer; v»rit«('atevilo arteri - ') ;re«dlii(atS:r:*ri); i; -0; repeat repeat vfritaC j *t: 3 .1 . ladaljna dalicav zulica ' , i . 3, * - ') ;r*adln(;ta InitCraph(grGriver.grModa,*'), Move To(začet«ki.¿acet«kY); krivulja(generacij t,roj«tn*Celica); rapiat until XayPreeaai; { čakaj na pritiak katerekoli tipke } ch:-RaadJCey; { preberi kater« tipka je bila pritisnjana > ClaaeGrapn, { naraj v ".akatovnj aacin } until ch=#27; { končaj ob pritisku na tipko ESC } and. { glavni > generacija O brez predstavitve 051021 32 5450 MUUUMU Slika 10 risanja. Po vsakem vnosu parametrov se krivulja nariše, in če želimo končati, pritisnemo tipko ESC, drugače pa katerokoli drugo tipko. Celice imajo lahko naslednje grafične predstavitve p, Če je Število vseh smeri enako n: če je 0