Autorské riešenie
[stiahni]

  • Počet riešiteľov: 4 / 4 = 100 %

  • Úspešnosť riešenia: 3.5 / 5 = 70 %

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.

obrus

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.

obrus

Ak sa na rad štvorčekov pozrieme pozornejšie zistíme, že ho vieme nakresliť pomocou dvoch lomených čiar.

obrus

Jedna z verzií procedúry kresliObrus môže vyzerať nasledovne: 

viem kresliObrus1 :pocet :strana
  opakuj :pocet [
    opakuj 2 [
      lomenaCiara :pocet :strana
      vp 180
    ]
    ph

    ;presun na dalsiu dvojicu lomenych ciar

    ;riesenie 1, s odmocninou
    ;vp 90
    ;do odmocnina 2*:strana*:strana
    ;vl 90

    ;riesenie 2, bez odmocniny
    vp 45
    do :strana
    vp 90
    do :strana
    vl 135
   
    pd
  ]
koniec

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
  vl 45
  opakuj :pocet [
    do :strana
    vp 90
    do :strana
    vl 90
  ]
  vp 45
koniec

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.

obrus

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:

  poradie     šírka     výška  
1 1 7
2 3 5
3 5 3
4 7 1
... ...  
i-ty 2*i-1 2 * počet počet štvorčekov na hrane - šírka

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
  vp 45
  opakuj :pocet [
    urobTu "sirka (pocitadlo * 2 - 1)
    urobTu "vyska 2 * :pocet - :sirka
    obdlznik :strana * :vyska :strana * :sirka
    ph do :strana vl 90 do :strana vp 90 pd
  ]
koniec

Procedúra obdlznik kreslí obdĺžnik so zadanými dĺžkami strán a vyzerá nasledovne:

viem obdlznik :vyska :sirka
  opakuj 2 [
    do :vyska
    vp 90
    do :sirka
    vp 90
  ]
koniec

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:

obrus

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
  vp 45
  urobTu "sirka 1
  urobTu "vyska :pocet * 2 - 1
  kresliObdlzniky :strana :sirka :vyska
koniecc

viem kresliObdlzniky :strana :sirka :vyska
  ak :vyska > 0 [
    vl 90
    do :strana
    vp 90
    do :strana
    kresliObdlzniky :strana :sirka+2 :vyska-2
    do :strana * (:vyska - 1)
    vp 90
    do :strana * :sirka
    vp 90
    do :strana * :vyska
    vp 90
    do :strana * (:sirka - 1)
    vp 90
  ]
koniec

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).