Autorské riešenie
[stiahni]

Podľa zadania úlohy máme vykresliť nový útvar medzi dvoma už nakreslenými útvarmi. Pri polohe posúvača úplne vľavo bude nový útvar totožný s útvarom vľavo, pri pravej krajnej polohe posúvača bude nový útvar totožný s útvarom vpravo. V ostatných polohách posúvača sa bude nový útvar podobať viac na ľavý alebo pravý nakreslený útvar.

vykreslenie potomka 1

vykreslenie potomka 2

Nový útvar vytvoríme pomocou bodov oboch pôvodných útvarov. Obidva útvary predstavujú lomené čiary s rovnakým počtom krajných bodov úsečiek. Jednotlivé body nového útvaru budú ležať na úsečke medzi odpovedajúcimi si bodmi oboch pôvodných útvarov. Ich súradnice vypočítame pomocou súradnic bodov obidvoch útvarov a hodnoty posúvača.

Označme si písmenom C bod nového útvaru, písmenom A bod ľavého útvaru a písmenom B bod pravého útvaru. Poďme vypočítať súradnice bodu C. Uvažujme len jeho x-ovú súradnicu cx.

Ak poloha posúvača je úplne vľavo (jeho hodnota posun=0), hodnota cx bude rovnaká ako hodnota ax, t. j. cx = ax

Ak poloha posúvača je úplne vpravo (jeho hodnota posun=1), hodnota cx bude rovnaká ako hodnota bx, t. j. cx = bx

Ak poloha posúvača je niekde medzi ľavým a pravým okrajom (jeho hodnota posun je nejaké číslo medzi 0 a 1), hodnotu cx vypočítame tak, že k hodnote ax pripočítame určitú časť dĺžky úsečky AB. Túto časť bude určovať hodnota posúvača posun. Hodnotu cx vypočítame podľa vzťahu cx = ax + ( bx- ax ) * posun

Po tomto rozbore môžme prejsť k vytvoreniu procedúry na vykreslenie nového útvaru. Pomocou cyklu prejdeme oboma zoznamami bodov popisujúcich ľavý a pravý útvar, ktoré sú uložené v globálnych premenných "ciara1 a "ciara2. Keďže obidva zoznamy majú rovnaký počet prvkov, na ich prechádzanie môžme použiť cyklus opakovania opakuj, ktorý sa bude opakovať počet :ciara1 krát alebo počet :ciara2 krát. Pred samotným cyklom nastavíme korytnačku "k1 ako aktívnu korytnačku a tiež farbu a hrúbku jej pera. Pre urýchlenie vykresľovania korytnačku skryjeme.

V cykle postupne vyberáme do premenných "a a "b súradnice odpovedajúcich párov bodov z oboch útvarov. Napr. pre body z prvého útvaru to dosiahneme nasledovne: urobTu "a prvok počítadlo :ciara1 a pre body z druhého útvaru urobTu "b prvok počítadlo :ciara2. Premenné "a a "b sú dvojprvkové zoznamy, ktoré v prvom prvku zoznamu majú uloženú x-ovú súradnicu a v druhom-poslednom prvku zoznamu y-ovú súradnicu. Potom X-ovu súradnicu bodu nového útvaru vypočítame pomocou príkazu urobTu "x (prvý :a) + ((prvý :b) - (prvý :a)) * posun'hodnota / 100. V danom príkaze sme hodnotu časti výrazu predelili hodnotou 100, lebo hodnota posúvača nebola v rozmedzí hodnôt 0 až 1, ale v rozmedzí 0 až 100. Podobne y-ovu súradnicu bodu nového útvaru určíme pomocou príkazu urobTu "y (posledný :a) + ((posledný :b) - (posledný :a)) * posun'hodnota / 100. Napokon bod nového útvaru s takto vypočítanými súradnicami [x y] zobrazíme. Výsledná procedúra kresliPotomka môže vyzerať nasledovne:

viem kresliPotomka
  odteraz "k1
  skry
  nechFP "fialová
  nechHP 3
  peroHore

  opakuj počet :ciara1 [
    urobTu "a prvok počítadlo :ciara1
    urobTu "b prvok počítadlo :ciara2
    urobTu "x (prvý :a) + ((prvý :b) - (prvý :a)) * posun'hodnota / 100
    urobTu "y (posledný :a) + ((posledný :b) - (posledný :a)) * posun'hodnota / 100
    nechPoz zoznam :x :y
    peroDolu
  ]
koniec

Vytvorená procedúra nie je vôbec zložitá, keď pochopíme ako vypočítavať súradnice bodov nového útvaru. Táto úloha je príkladom ako naprogramovať jednoduchý morfing - premenu jedného útvaru na druhý útvar. Zaujímavé by bolo rozšíriť riešenie úlohy aj o meniacusa farbu nového útvaru v závislosti od polohy posúvača medzi pôvodnými útvarmi.

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

Úloha bola celkom ľahká pre finalistov, až na jeden tím, ktorý stratil jeden bod, ostatných 6 tímov vyriešilo úlohu na plný počet bodov. Riešenia boli veľmi rôznorodé, pri prechádzaní jednotlivými bodmi útvarov súťažiaci použili rôzne druhy cyklov (opakuj, kým, prePrvky, preČísla). V niektorých riešeniach súťažiaci pri výpočte súradníc bodov nového útvaru nepracovali zvlášť s jednotlivými zložkami súradníc bodu, ale z celým zoznamom určujúcim pozíciu bodu. Tím JM&JM uviedol najstručnejší kód programu a tím lupa chválime za dôsledné okomentovanie programového kódu.