Autorské riešenie
[stiahni]

  • Počet riešiteľov: 10 / 11 = 90,9 %

  • Úspešnosť riešenia: 4,1 / 6 = 68,3 %

Táto úloha mala v podstate tri časti:

  1. dekódovať zápis obrázka na tabuľke;

  2. naprogramovať vykresľovanie obrázka podľa textu z tabuľky;

  3. nájsť kód pre vykreslenie šachovnice 3´3.

Ak si porovnáme kód a obrázok podľa neho vykreslený zistíme, že jednotlivé časti kódu môžeme chápať nasledovne.

kresliObrazok
[kolo 100 50 50 "cervena kolo 0 0 20 "fialova obsirnik 50 50 25 100 "modra sikmyObsirnik 0 100 50 100 -30 "zelena obsirnik -50 -50 50 100 "zlta]

  • kolo :posunX :posunY :polomer :farba

  • obsirnik :posunX :posunY :strana1 :strana2 :farba

  • sikmyObsirnik :posunX :posunY :strana1 :strana2 :zmenaNatocenia :farba
    alebo
    sikmyObsirnik :posunX :posunY :strana1 :strana2 :smer :farba

Ak už vieme, čo jednotlivé údaje znamenajú, môžeme sa pustiť do procedúry kresliObrázok. Keďže ju chceme použiť na vykresľovanie rôznych obrázkov je vhodné text z tabuľky použiť ako parameter procedúry. Budeme postupne týmto zoznamom dát prechádzať . Ak v ňom narazíme na jeden z troch názvov útvarov, môžeme príslušný útvar vykresliť. Pre každý útvar vieme, koľko parametrov ho definuje, kolo 4 paramatre, obsirnik 5 parametrov a sikmyObsirnik 6 parametrov. Procedúra kresliObrázok môže vyzerať nasledovne: 

viem kresliObrázok :data
  urobTu "i 1

  kym [:i < pocet :data] [
    urobTu "objekt (prvok :i :data)
    akJe :objekt [
      kolo [
        kolo prvok :i+1 :data
             prvok :i+2 :data
             prvok :i+3 :data
             prvok :i+4 :data
             urobTu "i :i+5
      ]
      obsirnik [
        obsirnik prvok :i+1 :data
                 prvok :i+2 :data
                 prvok :i+3 :data
                 prvok :i+4 :data
                 prvok :i+5 :data
                 urobTu "i :i+6
      ]
      sikmyObsirnik [
        sikmyObsirnik prvok :i+1 :data
                      prvok :i+2 :data
                      prvok :i+3 :data
                      prvok :i+4 :data
                      prvok :i+5 :data
                      prvok :i+6 :data
                      urobTu "i :i+7
      ]
    ]
  ]
koniec

Pre každý útvar sme si vytvorili samostatnú procedúru. Takto bude náš kód prehľadnejší. Všimnime si aj to, ako sa "posúvame" v zozname dát. Ak sme použili nejaké hodnoty ako parametre vykreslovaného útvaru, v zozname pokračujeme až za posledným z nich. Toto je zabezpečené zmenou hodnoty premennej "i.

Teraz sa môže pozrieť na jednotlivé procedúry pre kreslenie útvarov:

viem kolo :posunX :posunY :polomer :farba
  nechFp :farba
  ph
  nechPoz poz + zoznam :posunX :posunY
  kruh :polomer * 2
koniec

viem obsirnik :posunX :posunY :strana1 :strana2 :farba
  šikmýObšírnik :posunX :posunY :strana1 :strana2 0 :farba
koniec

viem sikmyObsirnik :posunX :posunY :strana1 :strana2 :zmenaNatocenia :farba
  ph
  nechFp :farba
  nechPoz poz + zoznam :posunX :posunY
  vp :zmenaNatocenia
  polygon [
    opakuj 2 [
      do :strana1
      vp 90
      do :strana2
      vp 90
    ]
  ]
  vl :zmenaNatocenia
koniec

Keďže obsirník a sikmyObsirnik sa líšia len počiatočným natočením, môžeme pri kreslení obsirnika využiť procedúru sikmyObsirnik. Jeho natočenie bude 0. Ušetríme si tak nie len písanie kódu ale znížime aj množstvo prípadných chýb.

Poslednou úlohou je nájsť kód pre vykreslenie čierno-bielej šachovnice s rozmermi 3´3. Takýchto kódov je niekoľko, záleží, ako sa na obrázok šachovnice pozrieme. Napr.:

[obsirnik 0 0 150 150 biela obsirnik 0 50 50 50 "cierna obsirnik 50 50 50 50 "cierna obsirnik 0 -100 50 50 "cierna obsirnik 50 50 50 50 "cierna]

sachovnica1

alebo aj

[obsirnik 0 0 150 150 "cierna obsirnik 0 50 50 50 "biela obsirnik 50 50 50 50 "biela obsirnik 0 -100 50 50 "biela obsirnik 50 50 50 50 "biela]

sachovnica2

Všimnime si, že aj keď má šachovnica 9 políčok, nám stačí vykresliť len 5 obsirnikov. Možno by niekoho napadlo, že biely obsirnik nemusime kresliť vôbec. To by sa však dalo len za predpokladu, že vždy kreslíme na biele pozadie.

Vaše zaujímavé riešenia a najčastejšie chyby

Pri riešení tejto úlohy ste boli pomerne úspešný. Často ste však nevyužili fakt, že pri kreslení obsirnika môžem využiť kreslenie sikmého obsirnik. Použili st eteda zbytočne veľa a navyše rovnakého kódu. Ďalšou chybou bolo, že n´vod na kreslenie ste nezadali ako parameter procedúry kresliObrázok, ale priamo ste volali príslušné procedúry. Takto však vaša procedúra kresliObrázok kreslí vždy jeden a ten istý obrázok.