Autorské riešenie
[stiahni]

Pri riešení tejto úlohy sa veľa nenapíšeme. Budeme však musieť rozmýšľať a dobre pozorovať, ako korytnačky kreslia čiary.

Jednotkou dĺžky je šírka obrazového prvku - pixela. Pre naše potreby môžeme uvažovať, že pixely na obrazovke tvoria štvorcovú sieť. Čiarkovaná čiara sa začína čiarkou dĺžky 5 a pokračuje medzerou dĺžky 5. To znamená, že za každých 10 bodov čiarkovanej čiary môžeme nakresliť jednu takúto dvojicu. Ostáva zistiť, koľko takýchto dvojíc bude výsledná čiarkovaná čiara obsahovať. Zistíme to pomocou celočíselného delenia: cPodiel :dlzka 10. Prvá časť riešenia by teda mohla vyzerať takto:

viem ciarkovanaCiara :dlzka
  opakuj cPodiel :dlzka 10 [
    pd
    do 5
    ph
    do 5
  ]
koniec

Po vykreslení dvojíc čiarka-medzera ostáva ešte dokresliť zvyšok. Dĺžka tohto zvyšku bude určite menšia ako 10 a väčšia alebo rovná 0. To ale znamená, že ak nechceme, aby celá čiarkovaná čiara končila medzerou, musíme celý zvyšok dokresliť čiarkou. Výsledná procedúra by teda mohla vyzerať takto:

viem ciarkovanaCiara :dlzka
  opakuj cPodiel :dlzka 10 [
    pd
    do 5
    ph
    do 5
  ]
  pd
  do zvysok :dlzka 10
koniec

Pozrime sa teraz na to, čo naša procedúra v skutočnosti robí. Vykreslíme niekoľko čiarkovaných čiar rôznych dĺžok a zväčšime si výsledok kreslenia.

Prvé, čo nás udiví je fakt, že každá čiarkovaná čiara je o 1 dlhšia ako by mala byť. Keď sa ale zamyslíme nad tým, čo nakreslí korytnačka príkazom do 1, niet sa čomu čudovať. Z aktuálnej pozície spraví krok dĺžky 1. Ak mala pero dole, zafarbila bod na ktorom sa nachádzala a aj bod, na ktorý vstúpila. Výsledkom je teda čiara dĺžky 2. Korytnačka teda vždy kreslí čiaru o 1 dlhšiu, ako je zadané v príkaze do.

Toto vieme upraviť veľmi jednoducho. Zadanú dĺžku zmenšíme o 1.

viem ciarkovanaCiara :dlzka
  urobTu "dlzka :dlzka - 1
  ...
koniec

Rovnako aj malé čiarky majú dĺžku 6 namiesto 5. Preto skrátime aj tieto. Medzera naopak, má namiesto dĺžky 5 len dĺžku 4. Medzery teda naopak o 1 predĺžime.

viem ciarkovanaCiara :dlzka
  urobTu "dlzka :dlzka - 1
  opakuj cPodiel :dlzka 10 [
    pd
    do 4
    ph
    do 6
  ]
  pd
  ak :dlzka >= 0 [
    do zvysok :dlzka 10
  ]
koniec

Keďže sme skrátili dĺžku zadanej čiary o 1, musíme ešte ošetriť situáciu, ak pôvodná dĺžka bola 0. Skrátením o 1 by sme dostali dĺžku -1. Výsledkom zvysok -1 10 je však 9. Takže pri dĺžke 0 by korytnačky kreslili čiaru dĺžky 9.

Ak sa pozrieme na výsledok takto upravenej procedúry, vidíme, že výsledné čiarkované čiary už majú požadovanú veľkosť.

Zatiaľ sme testovali kreslenie čiar len vo vodorovnom smere. Otázka je, ako to bude fungovať, v nejakom šikmom smere, napr. pod uhlom 45°. Tento prípad sme znázornili čiernou čiarou.

Tu si musíme uvedomiť, že jednotkou dĺžky je šírka obrazového prvku - pixela. Takže pohyb o celočíselnú dĺžku nebude rovný počtu pixelov, pretože sa pohybujeme po uhlopriečke, ktorej dĺžka je približne 1,41 (odmocnina z 2). Výsledný počet "zafarbených" pixelov záleží od toho, koľko násobok uhlopriečky "prejdeme".

Napr.:

Dĺžka 5 má najbližšie k číslu 4 * 1,41 = 5,66, preto sa zafarbia len 4 pixely.

Dĺžka 10 ma najbližšie k číslu 7 * 1,41 = 9,89, preto sa ku 4 čiernym pixelom pridajú len 3 biele.

Pre porovnanie, sme červenou zobrazili pôvodne vodorovne nakreslenú čiarkovanú čiaru, ktorú sme otočili o uhol 45°. Všimneme si ale, že červené a čierne čiaročky sa navzájom mierne posúvajú. Pri dlhších čiarkovaných čiarach by sa postupnosť 4 čierne a 3 biele pixely zrejme porušila.

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

Pri tejto úlohe si väčšina z vás neuvedomila fakt, že príkaz do x nekreslí čiaru dĺžky x, ale o 1 dlhšiu. Len dva tímy s touto skutočnosťou počítali. Čiastočne správne riešenie odovzdal tím Michal Bali. Spravne riešenie mal tím tím Expert JM&JM.