fraktály

Príklad 2

Napíšte rekurzívnu procedúru, pomocou ktorej sa vykreslí krivka podľa predlohy na obrázku, do zvoleného stupňa.

fraktál

Riešenie:
  1. Ak sa pozrieme na obrázok, tak vidíme, že krivka prvého stupňa je štvorec. A vieme, že kým je stupeň viac ako 0, tak za budú kresliť štvorce. Ďalej vieme, že budeme mať dva parametre, jeden bude dĺžka najdlhšej strany štvorca a druhý bude stupeň krivky. Teda časť procedúry bude vyzerať takto:

    viem stvorec :a :stupen
      ak :stupen>0
      [ opakuj 4
        [ do :a
          vl 90
        ]
      ]
    koniec

  2. Z obrázka vidíme, že na každom konci jednej hrany sa nakreslí štvorec tak, že majú spoločný len jeden bod. Náš štvorec sa vykresľuje doľava. Potrebujeme vložiť príkaz rekurzívneho volania do našej procedúry tak, aby sa ďalší štvorec dotýkal väčšieho iba rohom. Toto volanie vložíme, ešte pred otočením. Musíme však upraviť hodnoty parametrov. Dĺžka strany sa skracuje na polovicu a stupeň sa každým vykreslením znižuje. Po úprave parametrov a vložení rekurzívneho volania dostávame:

    viem stvorec :a :stupen
      ak :stupen>0
      [ opakuj 4
        [ do :a
          stvorec :a/2 :stupen-1
          vl 90
        ]
      ]
    koniec

  3. Takto upravená procedúra síce vykresľuje štvorce, ale menší štvorec je zle umiestnený vzhľadom k väčšiemu. Štvorce majú spoločnú jednu stranu.
    Stačí, ak otočíme menší štvorec okolo budúceho spoločného bodu o 90° doprava (spoločný bod je miesto odkiaľ rekurzívne voláme tú istú procedúru. Takto otočení už budeme kresliť štvorec tak ako máme, ale iba raz. Pri rekurzívnom vynáraní sme otočení do iného smeru ako by sme mali, takže sa musíme otočiť naspať. Musíme sa otočiť o toľko, o koľko sme sa otočili pred rekurzívnym volaním, teda doľava o 90°. Ak stupeň bude 0, tak toto otočenie spôsobí len to, že sa najprv otočíme do prava, potom do ľava a kreslíme ďalej štvorec.

    viem stvorec :a :stupen
      ak :stupen>0
      [ opakuj 4
        [ do :a
          vp 90
          stvorec :a/2 :stupen-1
          vl 90
          vl 90
        ]
      ]
    koniec

  4. Po úprave procedúry dostávame

    viem stvorec :a :stupen
      ak :stupen>0
      [ opakuj 4
        [ do :a
          vp 90
          stvorec :a/2 :stupen-1
          vl 180
        ]
      ]
    koniec

Procedúru môžme zavolať napríklad príkazom stvorce 200 5

Ak nie je vidieť Imagine projekt, treba stiahnuť Imagine plugin