P R E S E K List za mlade matematike, fizike, astronome in računalnikarje ISSN 0351-6652 Letnik 26 (1998/1999) Številka 5 Strani 274-278 Matija Lokar: KOCHOVA SNEŽINKA Ključne besede: računalništvo, programska oprema, simbolno računanje, DERIVE, Kochova krivulja. Elektronska verzija: http://www.presek.si/26/1381-Lokar.pdf © 1999 Društvo matematikov, fizikov in astronomov Slovenije © 2010 DMFA - založništvo KOCHOVA SNEŽINKA Zima se je poslovila in snežinke bodo kmalu le še oddaljeni spomin. Da ne bo prehod v poletno soparo prehitel', si z računalnikom pričarajmo še malo zimskega vzdušja in narišimo snežinko ali dve. Naše snežinke bodo seveda nekoliko matematično obarvane. Za osnovo bomo vzeli t.i. Kochovo krivuljo. Ta spada med rekurzivne objekte. Ti nastanejo tako, da z določenim postopkom preoblikujemo osnovni objekt v več enakih objektov. Osnovni objekt je lahko trikotnik, črta, kocka ali kaj drugega. Dobljene objekte z enakim postopkom preoblikujemo naprej. Tako poznamo Peanovo krivuljo, zmajnico, Hilbertovo krivuljo, trikotnik Sierpinskega. Več o teh krivuljah si lahko preberete v članku Cirila Pezdirja, Nenavadne krivulje, Presek 18 (1990/91), str. 56-64. Koehova krivulja Kochovo krivuljo dobimo tako, da ravno črto (Kochovo krivuljo ničtega. reda) razdelimo na tretjine. Srednji del izrežemo in ga nadomestimo z dvema črtama, ki bi skupaj z zbrisanim delom tvorili enakost.ranični trikotnik. Dobimo Kochovo krivuljo prvega reda. če postopek ponovimo na vseh štirih dobljenih črtali, nastane Koehova krivulja drugega reda. Od tod do Koehove snežinke ni več daleč. Vzamemo enakostranični trikotnik in mu namesto stranic narišemo Koehove krivulje ustreznega reda. KO K1 K2 iO^VA, Za risanje rekurzivnih objektov je zelo primeren programski jezik logo. Če ste tega jezika vsaj malo vešči, bo snežinka kaj hitro pred vami. Zanimiv članek o risanju Koehove snežinke najdete tudi na Internetu na naslovu http://www.eurologo.org/papers/logomov.html. A v logu smo v Preseku že veliko programirali. Zato si bomo tokrat ogledali, kako bi snežinko narisali s pomočjo programa DERIVE, Ta program je sicer namenjen predvsem simbolnemu računanju. Ker pa zna narisati točke in v njem lahko definiramo tudi rekurzivne funkcije, bo za našo nalogo povsem primeren. Risanje točk s programom DERIVE Točko v programu DERIVE podamo kot par koordinat v oglatih oklepajih, pri čemer sta koordinati ločeni z vejico. Tako je koordinatno izhodišče točka [0,0] , točko s koordinato x — 1 in koordinato y = 2 pa v programu DERIVE predstavimo kot. [1,2]. Če tak izraz (npr. [1,2]) narišemo, dobimo narisano točko (1,2). Če želimo narisati več točk, sestavimo vektor, katerega komponente so spet dvodimenzionalni vektorji - torej matriko velikosti n x 2, kjer je n število točk. Kadar imamo več točk, se lahko odločimo, ali bomo pri risanju točke med sabo povezali ali ne. Ko smo v oknu za risanje (ukaz Plot) z izbiro Options/State, nastavimo Mode v Connected ali pa v Discrete. 3FT10NS STATE: Coordinates: (Fectangnlar)Polar Mode: Connected ¡¡tngffiB Size:(LargeISma11 Follou:(Ves)Mo Trace: Yes(No) Select plot point node >oss x: 1_y:l_Scale x:Z_¡j:Z t>eriue ZD-plot Prva nastavitev pomeni, da DERTVE takrat, ko riše več točk, te med sabo poveže, druga nastavitev pa, da črt med zaporednimi točkami ne bo. »I II. Z) «1 11. £1 « 11, z. 3 1 if- 11. t. i I EOHHB ill U.liB Center Velele Help H« Option Not Buli M^jn Srnin transfer u.iwiik. aHn imm t »tel uftlon On*» .1 u'l Salt i 2 V'? .*&-» Im i (WWfli uma CeMtc*- Ih-IrCr Help Nmc Dptlank rial «iIt tinte Suh Trutfer Eni rr apthn Cnui r't n t Scale «ii tjrZ Ocflae £D-pli>l Če narišemo matriko velikosti 2x2, dobimo daljieo. Začetek daljice določa prva, konec pa druga vrstica matrike. Kochova krivulja s programom DERIVE Izračunajmo tri nove točke, ki nastanejo po prvem koraku. Definirajmo tri funkcije. Te vrnejo točke, ki skupaj s kraj išči prvotne črte določajo novo črto. Parametra vseli treh funkcij sta začetna in končna točka. Vnesimo z ukazom Author vse te tri funkcije. Izrazi z lihimi številkami so komentarji, ki jih lahko izpustimo. iti "Točka na tretjini med fl in B." b - a IZ: TT(a. bi := a *---- 3 »3: "Točka na d ur: h tretjinah med fl in B." «4: TDTta, b) := TTCb, a) #5: "Točka na osti." a + b >T3 »6: TG(3. b) := -+---ra - b , b - a -. Z 6 L Z Z 1 l1 ;ont1AND: ilUilffl Ril i Id Calculus Declare Expand Factor Help Junp soLue Manage Options Flot Quit flemove Simp]ify Transfer Unremowe moUe Uindou approX Enter option J ser_ Free: lBBz Ins__Periue Algebra Nekaj težav imamo lahko pri vnosu indeksov. Ce želimo dobiti koordinato x prve točke, moramo vzeti prvo komponento iz a. To storimo z a SUB 1. Zadnjo funkcijo torej vnesemo kot TOCa.b) := (a+b)/2 + SQRT(3)/6 [(a SUB 2-b SUB 2),(b SUB i-a SUB 1)] Da bomo videli, ali delamo prav, narišimo tako dobljeno črto. Naj bo u začetna točka (denimo [—1,1]) in v končna točka ([1,1]). Narisati moramo torej poligonsko črto [u, TT(u,v), T0(u,v), TDT(u,v), v]. Žal DERIVE izraza ne zna narisati kar v taki obliki, ampak ga moramo prej poenostaviti z ukazom Simplify. Ne pozabimo, da moramo pri Options/State v risalnem oknu nastaviti povezovanje točk. Za računanje točk, ki določajo krivuljo višjega reda, uporabimo rekur-zijo. Če je stopnja krivulje enaka 0, vrnemo kraj išči, drugače pa oglišča po-ligonske črte, ki jo sestavljajo Kochove krivulje, eno nižje stopnje nad odseki: od u do TT(u, v), od TTCu.v) do T0(u,v), od TOCu.v) do TDTCu.v) in od TDTfUjV) do v. Dobimo torej poligonsko črto, sestavljeno iz množice daljic. IWinANI: ; IHM.U.I Center Delete Help tloue Options Plot Quit Range Scale Transfer U iri(too aXes Zoom Enter optinn ;ross x: 1_tjj_l_Scale x: 1_g:l Ves naš program za risanje Kochove krivulje je torej: "Točka na tretjini med A in B." TT(a,b) := a + (b - a) / 3 "Točka na dveh tretjinah med A in B." TDTCa.b) := TT(b,a) "Točka na osti." T0(a,b) := (a+b>/2 + SQRT(3)/6 [Ca SOB 2-b SUB 2),(b SOB 1-a SUB 1)] "Kochova črta." CRTA(a,b,n) := IF(n-0,[a,b],[CRTA(a,TT(a,b),n-l), CE.TA(TT(a,b) ,T0(a,b) ,n-l) , CRTA(T0(a,b),TDT(a,b),n-l), CRTA(TDT(a,b),b,n-l)] ) Seveda zadnjo funkcijo vpišemo vso v eni vrst.i. Sedaj lahko vnesemo izraz CRTA( [-2,0],[2,0],3) in ga poenostavimo s Simplify. Dobimo dolg vektor točk. Ce jih narišemo (Plot/Plot), dobimo Kochovo krivuljo tretjega reda med točkama [-2,0] in [2,0], Če narišemo sedaj Kochovo črto nad oglišči trikotnika, dobimo snežinko. Večjo "nabrazdanost" (stopnjo krivulje) bomo uporabili, lepša bo. Za bolj zimsko vzdušje pa še nekaj snežink, dobljenih tako, da. srno med sabo povezali nekaj Kochovih črt. Matija Lokar