Napíšte rekurzívny podprogram, ktorý nakreslí obrázok podľa predlohy, do zadaného stupňa (ak sa zadá 1, tak sa nakreslí len trojuholník A; ak 2, tak sa nakreslí trojuholník A a kruh; ak 3, tak sa nakreslí obrázok ako pri zadaní 2 a k nemu sa pridá trojuholník B, atď.).
Riešenie:
- Z predchádzajúcich príkladov už vieme, že najprv potrebujeme určiť z koľkých rôznych častí sa skladá výstup (obrázok). Máme nakresliť čiaru, ktorá sa skladá z dvoch rôznych trojuholníkov(každý z nich je vzhľadom na vodorovnú čiaru natočený na inú stranu) a s kruhu.
Naše procedúry budú vyzerať takto:
Procedúra pre kruh vyzerá takto:
viem KRUHY |
|
elipsa[60 60] |
koniec |
Procedúra pre trojuholníky budú upravené už tak, ako sa budú od začiatku vykresľovať.
Procedúra vyzerá:
pre jeden trojuholník takto: |
a pre druhý takto: |
viem TROJ |
|
vl 90 |
|
do 30 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 30 |
koniec |
|
viem TROJR |
|
vl 30 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
koniec |
|
Keďže kruh vieme vykresliť tak, že stojíme uprostred neho, preto musíme procedúru KRUHY upraviť. Upravíme ju tak, že prejdeme do prostriedku kruhu, potom vykreslíme kruh a zase prejdeme na koniec kruhu (na opačnú stranu s akej sme prišli) , aby sme vedeli vykresliť ďalší útvar, ktorý ma nasledovať za kruhom.
Aj procedúry TROJ a TROJR upravíme tak, aby po dokončení kreslenia trojuholníka mohol sa vykresliť ďalší útvar, ktorý nasleduje.
|
Pri presúvaní, ktoré je len pomocné(vzhľadom k výstupu) nesmieme zabudnúť zdvihnúť pero (aby sme za sebou zbytočne neťahali čiaru) a potom ho zase položiť. |
Upravené procedúry vyzerajú takto:
|
viem KRUHY |
|
|
ph |
|
|
do 30 |
|
|
pd |
|
|
elipsa[60 60] |
|
|
ph |
|
|
do 30 |
|
|
pd |
|
koniec |
viem TROJ |
|
vl 90 |
|
do 30 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 30 |
|
vp 90 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
koniec |
|
viem TROJR |
|
vl 30 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
vp 30 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
nechfv ? |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
koniec |
|
- Už z predchádzajúcich príkladov vieme, že musíme definovať miesto pre rekurzívne volanie, parameter a spôsob zmeny parametra.
- Rekurzívne volanie musí byť za príkazmi nakreslenia daného útvaru.
- Parameter procedúry bude stupeň čiary (počet nakreslených útvarov).
- Hodnota parametra sa bude znižovať vtedy, ak nakreslime príslušný útvar a v rekurzívnom volaní už bude hodnota parametra o 1 nižšia.
Dôležité je rozhodnúť o tom, ktorá procedúra bude ktorú volať. Keďže najprv sa musí nakresliť trojuholník TROJR potom KRUHY a nakoniec TROJ, tak v takom poradí sa budú navzájom volať.
- KRUHY bude volať TROJ
- TROJ bude volať TROJR
- TROJR bude volať KRUHY
Upravene procedúry budú vyzerať takto:
|
viem KRUHY :a |
|
|
ph |
|
|
do 30 |
|
|
pd |
|
|
elipsa[60 60] |
|
|
ph |
|
|
do 30 |
|
|
pd |
|
|
TROJR :a-1 |
|
koniec |
viem TROJ :b |
|
vl 90 |
|
do 30 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 30 |
|
vp 90 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
TROJR :b-1 |
koniec |
|
viem TROJR :c |
|
vl 30 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
vp 30 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
nechfv ? |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
KRUHY :c-1 |
koniec |
|
- Pre konečnosť nášho programu nám treba ešte určiť podmienku ukončenia a podľa toho upraviť procedúry. Ako v predchádzajúcich príkladov, tak aj tu musí platiť aby stupeň čiary bol väčší ako 0, inak sa nemôže nakresliť. Podľa toho stačí určiť podmienku, že program má bežať pokiaľ stupeň bude väčší ako 0.
Riešenie:
|
viem KRUHY :a |
|
ak :a>0 |
|
[ |
ph |
|
|
do 30 |
|
|
pd |
|
|
elipsa[60 60] |
|
|
ph |
|
|
do 30 |
|
|
pd |
|
|
TROJR :a-1 |
|
] |
|
|
koniec |
viem TROJ :b |
ak :b>0 |
[ |
vl 90 |
|
do 30 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 30 |
|
vp 90 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
TROJR :b-1 |
] |
|
koniec |
|
viem TROJR :c |
ak :c>0 |
[ |
vl 30 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
do 60 vp 120 |
|
vp 30 |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
nechfv ? |
|
vypln |
|
ph |
|
do (sqrt(60*60-30*30))/2 |
|
pd |
|
KRUHY :c-1 |
] |
|
koniec |
|
Aby sme nakrelsili požadovaný útvar tak sa zavolá napríklad procedúra KRUHY 5
Ak nie je vidieť Imagine projekt, treba stiahnuť Imagine plugin
|