|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||
6. lecke - SpirálokCSIGAVONAL - 1. PRÓBÁLKOZÁSEbben a leckében csigavonalakat,azaz spirálokat fogunk rajzolni. De hogyan? Ahogy az ábrákon is látszik, ha csigavonalat szeretnénk rajzoltatni a teknőccel, nem kell neki mást mondani, minthogy menjen előre, majd forduljon jobbra, majd megint előre, majd megint forduljon jobbra, stb. Csak az a kérdés, hogy mennyit menjen és mennyit forduljon? Próbáljuk ki, mi történik, ha a teknőc minden lépésben ugyanannyit megy előre és ugyanannyit is fordul! Ehhez használhatjuk az ismétlés parancsot. Ahhoz, hogy a csigavonal ne nézzen ki túl szögletesnek, inkább kereknek, nagyon pici lépéseket kell tennünk a fordulások között. Lássuk tehát a következőt: ismétlés 36 [előre 3 jobbra 10] Ez bizony így egy kört rajzol. Próbáljuk ki más hosszal és fordulással: ismétlés 40 [előre 2 jobbra 9] ismétlés 360 [előre 1 jobbra 1] Látható, hogy ha az ismétlés paranccsal próbálunk rajzolni, a teknőc mindenképpen kört rajzol. Spirál rajzolásánál ugyanis az előre parancs után következő lépéshosszt minden lépésben egy kicsit növelni kellene. Ha a legegyszerűbb ábrát közelről megnézed, láthatod, hogy a fordulási szög ugyanaz minden lépésben, de a lépéshossz mindig nő egy keveset. Próbáljuk ki a következőt: előre 1
Ez bizony már csigavonal! A következő kérdés csak az, hogyan tudnánk ezt eljárásban megírni, úgy, hogy ne kelljen ennyit írni. Vagyis egyszerűsíteni és rövidíteni kellene. Ehhez egy olyan paraméterre van szükségünk, melynek értékét minden lépésben meg kell változtatni. Ezt az ismétlés paranccsal nem tudjuk megoldani, mivel annak segítségével csak pontosan ugyanazokat az utasításokat tudjuk ismételgetni, pontosan ugyanazokkal a paraméterekkel, változtatásra nincs mód. REKURZIÓEzért van szükség a rekurzióra. A rekurzió azt jelenti, hogy egy (általában egyszerű) eljáráson belül meghívjuk ugyanazt az eljárást, vagyis saját magát megváltoztatott paraméterekkel. Az újonnan meghívott eljárás megint meghívja saját magát, majd megint és megint. Úgy, mint amikor beállsz két szembeállított tükör közé, és a tükörben így látod magadat és a tükröt kisebben, abban a tükörben megintcsak magadat és a tükröt még kisebben, és így tovább, egyre kisebben és kisebben a végtelenségig. A rekurzív eljárás azonban nem tarthat a végtelenségig, valahogy bele kell írni, hogy meddig hívogassa meg saját magát. Ezért szükségünk lesz benne egy feltételre: az eljárás mindig csak akkor hívja meg önmagát, hogyha a feltétel teljesül, különben leáll. A mi esetünkben a rekurzív eljárás abból áll majd, hogy a teknőc előre megy valamennyit, majd jobbra fordul. Ezután meghívja önmagát egy kicsit nagyobb lépéshosszal. Tehát egy kicsit többet megy előre, és jobbra fordul. Majd még többet megy előre, és jobbra fordul. Így rajzol spirált. Mindezt addig teszi, amíg a lépéshossz el nem ér egy megadott számot. A feltételünk tehát az lesz, hogy akkor hajtsa végre az utasításokat, ha a lépéshossz még nem nagyobb egy bizonyos számnál, pl. 30-nál. A lépéshosszt majd 1-gyel kezdjük, minden lépésben 1-gyel növeljük, addig, amíg 30-ig el nem ér. Így pontosan az előző ábrát kapjuk majd. Ezt a legegyszerűbb eljárást spirál0-nak neveztem el, a paramétert (a lépéshosszt) pedig lépés-nek. Tehát az eljárás: tanuld spirál0 :lépés Nézzük meg egyesével, hogy mit is csinálnak az eljárás belsejében lévő utasítások: ha :lépés <= 30 - ez a feltétel: csak addig hajtsa végre az utasításokat (amik a szögletes zárójelen belül vannak), amíg a lépéshossz el nem éri a 30-at. Mivel a spirál akkor lesz a legszebb, ha a lépéshosszt 1-ről kezdjük, ezt az eljárást mindig a spirál0 1 paranccsal kell meghívni. Ezért akár írhatunk egy főeljárást is, melynek nincs paramétere, és csak annyit tesz, hogy meghívja ezt az eljárást (a neve legyen főspirál0). Ez a következőképpen néz ki: tanuld főspirál0 Most már a főspirál0 paranccsal bármikor megrajzolhatod a spirált. Természetesen a tollszínt és tollvastagságot kedvedre változtathatod. Hosszabb csigavonalat is rajzolhatsz, ehhez a spirál0 eljárásban a feltételben szereplő számot kell megnövelni (pl. 30 helyett 40-re), így az eljárás többször hívja meg magát, és csak később áll le. SZÍNES SPIRÁLOKSőt, mi lenne, ha a spirál nem egyszínű lenne, hanem színes?
Látszik, hogy minden lépés után megváltoztattam a színt, mégpedig véletlenszerűen, a véletlenszám parancs segítségével. Ezt az új utasítást a spirál0 eljárás elejére kell beírni, tehát az eljárás így módosul: tanuld spirál0 :lépés Igaz, hogy eddig mindig a véletlenszám 16 parancsot használtuk a színválasztáshoz, de tudjuk, hogy az 0-tól 15-ig választ számot. A 15-ös szám azonban a fehéret jelenti, és most úgy szeretnék színt választani, hogy a fehér ne legyen köztük, mert az a fehér háttéren nem látszik. Ezért írtam véletlenszám 15-öt, mely csak 0-tól 14-ig választ egy számot, vagyis a fehéret sohasem választja. Játsszunk még egy kicsit a spirálunkkal! Mi történik, ha az elfordulás szögét változtatjuk meg az eljárásban?
SPIRÁLMINTÁKMegpróbálhatunk több ilyen spiráltis rajzolni ugyanabból a középpontból úgy, hogy közöttük elfordulunk valamennyit. Hátha gyönyörű spirálmintákat kapunk.
A gond az, hogy a spirált mindig középről kezdjük rajzolni, de nem középen hagyjuk abba, hanem a végénél. Ahhoz, hogy ugyanabból a pontból kezdhessük a spirálokat, valahogy mindig vissza kell jutnunk középre. Ha a képernyő közepére rajzolunk, akkor ezt könnyen megtehetjük a haza parancs segítségével. E parancs hatására a teknőc mindig visszamegy a képernyő közepére, de vigyázz, ha nem emeled fel a parancs előtt a tollat, akkor vonalat is húz középig!
Ki tudja a legszebb spirálmintát rajzolni? Változtasd meg az ismétlések számát, az elfordulás szögét, a kezdőpontokat! SOKSZÖGEKBŐL ÁLLÓ SPIRÁLOKNemcsak apró szakaszokból lehet azonban spirált rajzolni, hanem bármilyen alakzatból. Ehhez segítségül hívjuk a 0. leckében megírt általános, szabályos sokszögeket rajzoló eljárásunkat. Ismételjük át, hogy is nézett ki: tanuld soksz :n :hossz Két paramétere van tehát: n, ami a sokszög szögeinek száma, és hossz, ami a sokszög oldalhosszát határozza meg. Háromszöget például a soksz 3 100, négyzetet a soksz 4 50, tízszöget a soksz 10 30 paranccsal rajzolhatunk. A spirál megrajzolásakor pedig a kis szakaszokat most "láthatatlanul", azaz felemelt tollal rajzoljuk majd, minden kis szakasz végén pedig rajzolunk egy háromszöget, lépésenként növekvő oldalhosszal (az oldalhossz ugyanaz lesz, mint a lépéshossz).
Ahhoz, hogy a legkisebb háromszögek is látsszanak a spirál közepén, nem muszáj 1-es lépésszámmal meghívni az eljárást, lehet 3-mal, 5-tel vagy akár 10-zel is. Próbáld ki, melyik a legszebb: spirál1 1 spirál1 3 spirál1 5 spirál1 10 Amelyiket a legszebbnek tartod, arra akár írhatsz egy főeljárást is, pl: tanuld főspirál1 Próbálj ki más sokszögeket is! Az oldalhosszuk lehet akár nagyobb is, maradhat állandó is, és a színt sem muszáj a véletlenszám paranccsal meghatározni, rajzolhatsz egyszínű csigavonalakat is. Íme még két példa:
És Te tudsz hasonlókat? SOKSZÖGMINTÁKBÓL ÁLLÓ SPIRÁLOKMi történik, ha nem szabályos sokszögekethasználunk fel a spirálban, hanem kisebb mintákat, melyeket szabályos sokszögekből építünk fel? Például egy 8 négyzetből álló sokszögmintát (olyat, mint amiket az 1. leckében rajzoltunk), melyre először külön eljárást írunk:
Ezeket az eljárásokat is az előzőekhez hasonlóan, a kezdeti lépéshossz megadásával kell meghívni. Ez a spirál már egész hasonló egy igazi tengeri csigaházhoz. Megpróbálhatunk közönséges csigához hasonló csigavonalat is rajzolni. Ennek egészen kereknek kellene lennie, vagyis a legjobb lenne, ha körökből állna. Nos, igazán szép kört csak nagyon nagy méretben tudnánk rajzolni, most kicsit csalni fogunk, és 36-szöget használunk helyette, mely nagyon hasonlít a körhöz. 36-szöget viszont egyszerűen a már meglévő soksz eljárásunkkal is tudunk rajzolni.
Vigyázz, ez a spirál hatalmas lesz, ha középről kezded, nem is biztos, hogy kifér a képernyőre! BEKÜLDENDŐ FELADATOK1. FELADAT
2. FELADAT
3. FELADAT
4. FELADATRajzolj saját spirálokat! Állhatnak sokszögekből vagy kisebb mintákból, lehetnek sokszínűek vagy egyszínűek, a lényeg, hogy minél változatosabbak legyenek!
|