Autorské riešenie
Táto úloha je zaujímavá najmä tým, koľko rôznych spôsobov jej riešenia existuje. Ukážme si aspoň niektoré. Asi prvé čo nám napadne je kresliť rady štvorčekov. Každý párny je mierne posunutý hore voči nepárnym a má o jeden štvorček menej ako tie nepárne. Takýchto radov je toľko ako dvojnásobok počtu štvorčekov na strane veľkého štvorca zmenšený o jedna. Napr. na nasledujúcom vzore vidíme vzor, ktorý má rozmer 4x4 štvorčekov a počet radov je 2*4-1=7.
Toto riešenie však má aj svoje nevýhody. Niektoré hrany malých štvorčekov kreslíme viackrát. Čo by sa stalo, ak by sme žlté štvorčeky vôbec nekreslili? Asi nič zlé, pretože mi chceme kresliť len obrys bez výplne.
Ak sa na rad štvorčekov pozrieme pozornejšie zistíme, že ho vieme nakresliť pomocou dvoch lomených čiar.
Jedna z verzií procedúry kresliObrus môže vyzerať nasledovne: viem kresliObrus1 :pocet :strana Pričom procedúra lomenaCiara kreslí čiaru, ktorá je na predchádzajúcom obrázku znázornená červenou, resp. modrou farbou. Procedúra lomenaCiara vyzerá nasledovne: viem lomenaCiara :pocet :strana Pri ďalšom spôsobe riešenia nám pomôže, ak sa na obrázok pozrieme pod iným uhlom a trochu z nadhľadu. Pozrime sa, či malé štvorčeky nie sú vytvorené pomocou iných útvarov. Všimnime si, že rovnaký vzor vieme nakresliť pomocou rôzne veľkých obdĺžnikov. Ak začneme kresliť od červeného obdĺžnika, každý ďalší v poradí je o dve dĺžky strany nižší a o dve dĺžky strany širší. Obdĺžnikov je toľko, koľko je malých štvorčekov na strane veľkého štvorca Kým začneme programovať je vhodné, aby sme našli vzťah medzi poradím kresleného obdĺžnika a jeho šírkou a výškou. Zatiaľ uvažujme o šírke a výške len ako o násobkoch dĺžky strany malého štvorčeka. Pomôže nám k tomu nasledujúca tabuľka:
Zatiaľ čo šírka začína pri 1 a zvyšuje sa o 2, výška je na tom presne naopak. Druhá verzia procedúry kresliObrus môže vyzerať napr. takto: viem kresliObrus2 :pocet :strana Procedúra obdlznik kreslí obdĺžnik so zadanými dĺžkami strán a vyzerá nasledovne: viem obdlznik :vyska :sirka V našich úvahách o spôsobe kreslenia vzoru na obruse môžeme pokračovať ďalej. Vyššie uvedené spôsoby pri kreslení buď kreslia niektoré čiary opakovane alebo presúvajú korytnačky bez kreslenia. Nedal by sa tento vzor nakresliť jedným ťahom bez zdvihnutia kresliaceho pera? Odpoveď je, dal. Ako na to? Riešenie ktoré si ukážeme je skôr vhodné na precvičenie si logického a algoritmického myslenia, než na praktické použitie. Problémom nasledovného prístupu je, že je náročnejšie na pamäť počítača. Ako teda budeme postupovať? Náš postup demonštruje nasledovný obrázok:
Ako prvý začneme kresliť červený obdĺžnik. Na mieste, kde sa pretína s druhým, modrým obdĺžnikom, prerušíme jeho kreslenie a začneme kresliť modrý. Rovnako postupujeme aj pri kreslení modrého obdĺžnika. Na mieste prieniku s oranžovým obdĺžnikom jeho kreslenie prerušíme a pokračujeme kreslením oranžového obdĺžnika. Takto pokračujeme dovtedy, kým môžeme začať kresliť nejaký ďalší obdĺžnik. Ak už taký nie je, vrátime sa tam, kde sme kreslenie nejakého obdĺžnika prerušili a dokreslíme ho. Postupne teda dokreslíme všetky obdĺžniky. Dokreslime ich ale v opačnom poradí ako sme ich začali kresliť (červený, ktorý sme začali kresliť ako prvý bude dokreslený ako posledný). Ostáva ešte vyriešiť otázku, ako vieme, či kreslenie prerušiť a začať kresliť nejaký ďalší obdĺžnik. Uvedomme si ako sa menia dĺžky strán obdĺžnikov, šírka každého ďalšieho je o dve dĺžky (dĺžka - strana malého štvorčeka) väčšia, výška naopak, o dve dĺžky menšia. Ak by sme teda mali začať kresliť obdĺžnik, ktorého výška nie je aspoň 1, nemusíme ho kresliť. Kreslenie si rozdelíme na dve časti. V procedúre kresliObrus si vypočítame veľkosť prvého obdĺžnika a zavoláme procedúru kresliObdlzniky. Táto nakreslí zadaný obdĺžnik aj s tým, že jeho kreslenie na vhodnom mieste preruší a pokúsi sa nakresliť ďalší obdĺžnik v poradí. Samozrejme, s inými dĺžkami strán. viem kresliObrus3 :pocet :strana viem kresliObdlzniky :strana :sirka :vyska Vaše zaujímavé riešenia a najčastejšie chyby Vo vašich riešeniach sa objavili nasledujúce chyby: zbytočné, viacnásobné prekresľovanie čiar a malých štvorčekov, vykreslené neúplné vzory alebo vzor s nesprávnym pomerom strán (nie štvorec). |
||||||||||||||||||||||||||||||||||||||||||||||||||||
© Univerzita Pavla Jozefa Šafárika v Košiciach, Prírodovedecká fakulta, Ústav informatiky palmaj (zavinac) upjs.sk |