Autorské riešenie
[stiahni]

Kreslenie erbu sa na prvý pohľad nezdá zložité, ale obsahuje 3 podproblémy: vykreslenie obrysu erbu, nakreslenie schodíkov a nakoniec napísanie textu PJ.

  1. Vykreslenie obrysu erbu:

    Pred samotným kreslením musíme najprv vypočítať dĺžku strany štvorcovej časti erbu, označme :z.

    Vstupnými premennými procedúry erb sú :y, dĺžka strany štvorčeka, a :poc, počet štvorčekov v najvyššom stĺpci. Preto hodnotu premennej :z, vypočítame ako ich súčin.

    urobTu "z :y*:poc

    Keďže vieme, že spodná časť erbu je rovnostranný trojuholník s dĺžkou strany z, tak vieme, že všetky vnútorné uhly trojuholníka majú veľkosť 60°. Preto pri kreslení spodnej časti sa korytnačka bude otáčať o 90°-60° (z prechodu a do prechodu do štvorcovej časti erbu) alebo 180°-60°(pri vykreslovaní vrcholu trojuholníka).

    Na vykreslenie a ľahšie vyfarbenie erbu využijeme príkaz polygon. Predtým ale nastavíme farbu a hrúbku pera a farbu výplne. Nakoniec podproblém na vykreslenie erbu vyzerá nasledovne:

    nechFP "zelena1
    nechHP 5
    nechFV "hneda1

    urobTu "z :y*:poc

    polygon [do :z vp 30 do :z vp 120 do :z vp 30 opakuj 2[do :z vp 90]]

  2. Vykreslenie schodíkov:

    Vykreslenie radu štvorcov, ktoré sú vyfarbené, si uľahčíme príkazom polynom, v ktorom tele je definícia vykreslenia štvorca. Keďže počet štvorčekov v stĺpci je ukrytý v premennej :poc, tak ich vykreslenie vykonáme pomocou príkazu opakuj.

    opakuj :poc [polygon [opakuj 4[do :y vp 90]] do :y]

    Keďže štvorce sú vyfarbené striedavo, tak je potrebné do cyklu pridať podmienku, ktorá bude nastavovať farby výplne jednotlivých štvorcov. Podmienka je založená na poradí vykresľovaného štvorca. Či je na párnej alebo nepárnej pozícii. Postupnosť príkazov na vykreslenie jedného radu štvorcov je nasledovná:

    opakuj :poc[ ak2 (mod pocitadlo 2)=1
                            [nechFV "zelena1 polygon [opakuj 4[do :y vp 90]]]
                            [nechFV "zelena11 polygon [opakuj 4[do :y vp 90]]]
                        do :y
                      ]

    Teraz sme vykreslili jeden stĺpec, ktorý má počet štvorcov taký, aká je hodnota premennej :poc. Ak chceme vykresliť všetky stĺpce použijeme príkaz opakovania, v ktorom riadiacou premennou bude hodnota počtu štvorcov vo vykresľovanom stĺpci. Keďže sa vykreslenie vykonáva od najväčšieho počtu štvorcov po 1, tak sa riadiaca premenná pri každom prechode cyklu musí zmenšiť. Samozrejme, že nezabudneme na nastavovanie korytnačky tak, aby vykreslenie bolo presné. Potom cyklus na vykreslenie schodov bude vyzerať nasledovne:

    kym [:poc<>0]
           [opakuj :poc[ ak2 (mod pocitadlo 2)=1
                                    [nechFV "zelena1 polygon [opakuj 4[do :y vp 90]]]
                                    [nechFV "zelena11 polygon [opakuj 4[do :y vp 90]]]
                                do :y
                              ]
              vp 90
              do :y
              vl 90
              urob "poc :poc-1
              vz :poc*:y
            ]

  3. Vykreslenie nadpisu PJ:

    Na výpis nadpisu PJ použijeme príkaz text. Predtým pre vyditeľnosť textu ale nastavme font písma nasledovne: písmo Times New Roman a veľkosť 30.

    nechPismo [[Times New Roman] [30]]

    Nastavenie pozície, od ktorej má začať výpis textu je jednoduchý. Kedže korytnačka vypisuje text od pozície, na ktorej stojí, tak potrebujeme korytnačku umiestniť tak, aby bola 1/16 veľkosti strany erbu od okrajov. Keďže vzdialenosť od horného okraja má byť 1/16 strany, tak posun korytnačky z pozície, kde skončila vykresľovanie schodov, musí byť len o 15/16 veľkosti strany. Výpis aj s nastaveniami pozície na výpis teda vyzerá nasledovne:

    ph
    vz 15/16*:z
    vl 90
    do 1/16*:z
    vl 90
    nechFV "zlta9     ;vyplnenie časti erbu žltou farbou podľa obrázka
    vypln

    nechPismo [[Times New Roman] [30]]
    text "PJ

Sojením všetkých popísaných častí vykeslíme erb podľa obrázka.

Procedúra erb :y :poc vyzerá nasledovne:

viem erb :y :poc
    nechFP "zelena1
    nechHP 5
    nechFV "hneda1
    urobTu "z :y*:poc
    polygon [do :z vp 30 do :z vp 120 do :z vp 30 opakuj 2[do :z vp 90]]

    kym [:poc<>0]
           [opakuj :poc[ ak2 (mod pocitadlo 2)=1
                                    [nechFV "zelena1 polygon [opakuj 4[do :y vp 90]]]
                                    [nechFV "zelena11 polygon [opakuj 4[do :y vp 90]]]
                                do :y
                              ]
              vp 90
              do :y
              vl 90
              urob "poc :poc-1
              vz :poc*:y
            ]

    ph
    vz 15/16*:z
    vl 90
    do 1/16*:z
    vl 90
    nechFV "zlta9
    vypln

    nechPismo [[Times New Roman] [30]]
    text "PJ
koniec

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

Pri vykresľovaní obrysov erbu ste všetci uspeli. :) Prepočet veľkostí strán a nastavovanie farieb v úlohe vám nerobilo žiaden problém. Avšak pri vykresľovaní schodov je potrebné zvážiť či je dobré použiť rekurziu. V tomto prípade to nie je správna voľba, lebo zložitosť pri rekurzívnom vykresľovaní schodíkov je podstatne vyššia, ako keď použijete dva do seba vnorené cykly. Preto si pozrite autorské riešenie. Ak už ste sa rozhodli použiť vnorené cykly, tak sa nebojte používať premenné, ktoré sú definované na vstupe. Nemuseli ste najprv hodnotu premennej :poc priradiť vašej vlastnej premennej, s ktorou ste už potom pracovali správne. A tak isto existuje v príkaze opakuj riadiaca premenná pocitadlo, ktoré ste tiež mohli použiť.