Strona główna » Poradniki » Logomocja » LOGIA » Logia 2005/06 - Etap I
 

Logia 2005/06 - Etap I

· Etap I · Etap II · Etap III ·
iOryginalna treść zadań jest dostępna pod oficjalnym adresem konkursu LOGIA

Zadanie 1

Napisz bezparametrową procedurę POSADZKA, która kreśli na środku ekranu następujący fragment arabskiej posadzki.

Założenia

Obrazek składa się z 19 identycznych fragmentów. Przyjmijmy, że długość boku sześciokąta w takim pojedynczym fragmencie to a. Wtedy procedura rysująca pojedynczy fragment przedstawia się następująco:

  1. oto POSADZKA_pom :a
  2.   pod
  3.   np :a pw 120
  4.   opu
  5.   powtórz 6 [
  6.     np :a
  7.     pw 60
  8.   ]
  9.   pod
  10.   lw 120 ws :a
  11.   opu

(2. - 4.) Przejdź do rysowania sześcioboka, (5. - 8.) narysuj go, a następnie (9. - 11.) wróć do pozycji wyjściowej. Kolejnym etapem będzie teraz narysowanie pozostałej części rysunku. W tym przypadku warto zauważyć, że ten fragment kodu można narysować dwa razy z przesunięciem o 60 stopni.

  1.   powtórz 2[
  2.     pod
  3.     lw 30 np :a/4
  4.     pw 60
  5.     opu
  6.     powtórz 3 [
  7.       np :a*1.5
  8.       pw 60
  9.       powtórz 2 [
  10.         np :a/4
  11.         pw 60
  12.       ]
  13.       np :a*1.5
  14.       lw 60
  15.     ]
  16.     pod
  17.     lw 60 ws :a/4
  18.     pw 30
  19.     opu
  20.     pw 60
  21.   ]
  22.   lw 120
  23. już

(12.) Narysuj dwie identyczne części: (13. - 16.) Przejdź do rysowania fragmentu i (17. - 26.) Narysuj 3 identyczne fragmenty obrazka. Przyjmuje się, że długość dłuższego boku jednej odnogi to 1.5a, a krótszy to a/4 podanego boku sześciokąta rysowanego na początku. (27. - 31.) Po narysowaniu należy wrócić do pozycji początkowej i obrócić o 60 stopni. Po narysowaniu dwóch kopii należy wrócić do pozycji wyjściowej na początku procedury (33.) obracają żółwia w lewo o 120 stopni.

Procedura główna

Pozostaje teraz tylko dopisać procedurę główną. W celu narysowania wszystkich fragmentów wystarczy narysować fragment pośrodku, a następnie dwa elementy do góry i jeden na prawo. W ten sposób rysowane jest wszystkie 19 elementów.

  1. oto POSADZKA
  2.   niech "a 35
  3.   niech "b :a * 2.6
  4.   powtórz 6 [
  5.     powtórz 3 [
  6.       POSADZKA_pom :a
  7.       pod
  8.       np :b
  9.       opu
  10.     ]
  11.     pod
  12.     ws :b
  13.     pw 120
  14.     np :b
  15.     opu
  16.     POSADZKA_pom :a
  17.     pod
  18.     ws :b
  19.     lw 120
  20.     ws :b * 2
  21.     opu
  22.     pw 60
  23.   ]
  24. już

(2.) Ustal bok sześciokąta pojedynczego elementu oraz (3.) o ile należy przechodzić pomiędzy kolejnymi elementami. (4.) Narysuj 6 razy wspomnianą kombinację: (5. - 10.) 3 elementy w górę (tutaj za każdym razem rysowany jest też środkowy element). (11. - 15.) Przejdź w prawo i (16.) narysuj element. Koniec każdego z sześciu powtórzeń należy zakończyć (17. - 21.) powrotem do pozycji wyjściowej na początku iteracji, a następnie obróceniu o 60 stopni. Warto zauważyć, że dzięki temu, że elementy są identyczne po obróceniu o dowolną wielkrotność 60 stopni to nie trzeba sie martwić o nieprawidłowo obrócony element.

Zadanie 2

Napisz procedurę KOLCZATKA :n, która tworzy na środku ekranu możliwie duże rysunki tak zwanych kolczatek. Dana :n określa stopień złożoności kolczatki, może przyjmować wartości od 1 do 10. Rysunki poniżej przedstawiają kolczatki o złożoności 1, 2, 4 i 7.

Fragment

W celu uproszczenie zadania warto napisać najpier procedurę KOLCZATKA_pom, która będzie przyjmować parametr :a - bok pojedynczego trójkąta.

  1. oto KOLCZATKA_pom :a
  2.   powtórz 6 [
  3.     wielokąt [
  4.       ukm "czarny
  5.       powtórz 2 [
  6.         lw 30
  7.         np :a
  8.         pw 60
  9.         np :a
  10.         pw 150
  11.       ]
  12.     ]
  13.     lw 30
  14.     wielokąt [
  15.       ukm "jasnoszary
  16.       powtórz 3 [
  17.         np :a
  18.         pw 120
  19.       ]
  20.     ]
  21.     pw 30
  22.     pw 60
  23.   ]
  24. już

Narysowanie pojedynczego elementu polega na (2.) narysowaniu 6 identycznych części. Każda z części składa się z (3. - 12.) czarnego deltoidu (dokładniej dwóch identycznych trójkątów), a następnie (13. - 21.) narysowaniu jasnszarego trójkątu. W ten sposób nie trzeba dodatkowo przesuwać żółwia do rysowania czarnego trójkąta. (22.) Na koniec każdej pętli należy pamiętać o obrocie o 60 stopni, aby kolejna część nie była rysowana w tym samym miejscu.

Procedura główna

  1. oto KOLCZATKA :n
  2.   niech "hmax 400
  3.   niech "h :hmax / (2 * :n + 2)
  4.   niech "a 2 * (:h / pwk(3))
  5.   pod
  6.   np :h * (:n - 1)
  7.   opu
  8.   powtórz (:n) [
  9.     powtórz (npw) [
  10.       KOLCZATKA_pom :a
  11.       pod
  12.       pw 90 np :a * 2
  13.       lw 90
  14.       opu
  15.     ]
  16.     pod
  17.     pw 90 ws (2 * npw + 1) * :a
  18.     lw 90 ws :h * 2
  19.     opu
  20.   ]
  21. już

(2.) Ustal maksymalną wysokość rysunku i (3.) oblicz wysokość pojedynczego trójkąta. Można to zrobić zauważając, że ilość poziomów to podwojona złożoność :n plus dwa. (4.) Na podstawie wysokości można obliczyć bok trójkąta. (5. - 7.) Przejdź do pierwszego wiersza. (8.) Narysuj :n poziomów. W każdym poziomie (9. - 15.) narysuj odpowiednią ilość kolaczetek. Po narysowaniu całego wiersza (16. - 19.) przejdź do następnego wiersza.

Zadanie 3

Napisz procedurę KALEJDOSKOP :n, która tworzy na środku ekranu rysunki takie jak poniżej. Dana :n określa stopień złożoności rysunku i może przyjmować wartości od 1 do 5. Trójkąty i kwadraty wypełnione są losowo kolorami. Poniżej przykłady rysunków o złożoności 2 i 4. Wielkość rysunku jest stała niezależnie od stopnia złożoności.

Założenia

Zadanie najłatwiej oprzeć o rozwiązanie rekurencyjne. Z tego powodu główna procedura KALEJDOSKOP wywoła funkcję pomocniczą i poda jej maksymalną wysokość pierwszego fragmentu oraz złożoność wprowadzoną prze użytkownika.

  1. oto KALEJDOSKOP :n
  2.   KALEJDOSKOP_pom 400 :n
  3. już

Rysowanie fragmentu

W rozwiązaniu rekurencyjnym najważniejszy jest warunek stopu. W tym przypadku przy przechodzeniu do kolejnej iteracji :n będzie zmniejszane o jeden, więc w przypadku, gdy :n nie będzie większe od 0 należy zaprzestać dalszego rysowania.

  1. oto KALEJDOSKOP_pom :hmax :n
  2.   jeśli (:n > 0) [
  3.     niech "h :hmax / (3 + pwk(3))
  4.     pod
  5.     ws :h * 1.5 pw 90
  6.     ws :h * 1.5 lw 90
  7.     opu

(2.) Jeśli jeszcze mają być rysowane kolejne poziomy to (3.) oblicz na podstawie maksymalnej wysokości mnożnik boków. (4. - 7.) Przejdź do lewego dolnego fragmentu rysunku.

  1.     opu
  2.     powtórz 4 [
  3.       wielokąt [
  4.         ukm jld
  5.         lw 60
  6.         powtórz 3 [
  7.           np :h
  8.           pw 120
  9.         ]
  10.       ]
  11.       np :h
  12.       wielokąt [
  13.         ukm jld
  14.         lw 90
  15.         powtórz 2 [
  16.           np (:h*0.5*pwk(3))
  17.           pw 90
  18.           np :h
  19.           pw 90
  20.         ]
  21.       ]
  22.       np :h
  23.       wielokąt [
  24.         lw 60
  25.         ukm jld
  26.         powtórz 3 [
  27.           np :h
  28.           pw 120
  29.         ]
  30.       ]
  31.       np :h
  32.       pw 90
  33.     ]
  34.     pod
  35.     np :h * 1.5 pw 90
  36.     np :h * 1.5 lw 90
  37.     opu
  38.     KALEJDOSKOP_pom (:h * 3) (:n - 1)
  39.   ]
  40. już

(8.) Każda z części składa się z czterech identycznych części: (9. - 16.) trójkątu, (18. - 27.) prostokąta oraz (28. - 36.) trójkąta. Po narysowaniu wszystkich czterech boków (40. - 43.) należy wrócić do miejsca z którego rozpoczęło się rysowanie i (44.) wywołać wykonywanie z nową maksymalną wysokością rysunku i mniejszą złożonością.

Zadanie 4

Napisz procedurę DYWAN :n rysującą na środku ekranu kwadratowe dywany takie, jak na poniższych rysunkach. Dana :n określa stopień złożoności wzoru dywanu i może przyjmować wartości od 1 do 10. Poniżej przykłady dywanów o złożoności 1, 3, 5 i 6. Wielkość dywanu jest stała niezależnie od stopnia złożoności wzoru.

Założenia

Generalnie obrazek składa się z 16 identycznych fragmentów. Pojedynczy fragment będzie rysować procedura DYWAN_pom na podstawie przekazanej długości boku :a oraz złożoności elementów :n. Poniżej znajduje się kod z wyjaśnieniem:

  1. oto DYWAN_pom :a :n
  2.   niech "d :a / (2 * :n)
  3.   powtórz 4 [
  4.     niech "npw_r npw
  5.     powtórz :n [
  6.       ukp (element ((reszta (npw + :npw_r) 2) + 1) ["jasnoszary "czarny])
  7.       niech "a 2 * :d * (:n - npw + 1)
  8.       wielokąt [
  9.         ukm (element ((reszta (npw + :npw_r) 2) + 1) ["jasnoszary "czarny])
  10.         np :a
  11.         pw 135
  12.         np (:a*0.5*pwk(2))
  13.       ]
  14.       np :d
  15.     ]
  16.     pod
  17.     np :d * :n
  18.     pw 90
  19.     opu
  20.   ]
  21.   ukp "czarny
  22. już

(2.) Oblicz różnicę pomiędzy kolejnymi wierzchołkami trójkątów we fragmencie. (3.) Narysuj cztery części - trójkąty. Za każdym razem zapamiętaj numer rysowanej części i (5. - 15.) narysuj wszystkie :n trójkątów wybierając na podstawie numeru części oraz numeru rysowanego trójkąta w części kolor. Po narysowaniu trójkąta (14.) przejdź o wyliczoną w (2.) linijce wartości :d. Po zakończeniu rysowania części (16. - 19.) Przejdź do następnego wierzchołka i skręć. (21.) Na koniec przywróć domyślny kolor pisaka.

Główna procedura

  1. oto DYWAN :n
  2.   niech "hmax 400
  3.   niech "a :hmax / 4
  4.   pod
  5.   lw 90 np :a * 2
  6.   pw 90 np :a
  7.   opu
  8.   powtórz 4 [
  9.     powtórz 4 [
  10.       DYWAN_pom :a :n
  11.       pod
  12.       pw 90 np :a
  13.       lw 90
  14.       opu
  15.     ]
  16.     pod
  17.     pw 90 ws :a * 4
  18.     lw 90 ws :a
  19.     opu
  20.   ]
  21.   ukp "czarny
  22. już

(2.) Ustal maksymalną wysokość rysunku i na tej podstawie (3.) oblicz bok :a poejdycznego fragmentu. (4. - 7.) Przejdź do lewego, dolnego wierzchołka prawego, lewego fragmentu rysunku. (8.) Narysuj cztery wiersze po (9. - 15.) cztery fragmenty. Po narysowaniu wiersza (16. - 19.) przejdź do następnego wiersza.