Strona główna » Poradniki » Logomocja » LOGIA » Logia 2001/02 - Etap I
 

Logia 2001/02 - Etap I

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

Zadanie 1

Napisz procedurę z jednym parametrem MOTYW :n, która dla danej wartości parametru :n - określającej stopień złożoności rysunku, utworzy na środku ekranu możliwie duży rysunek, podobny do przedstawionych poniżej. Parametr :n może przyjmować wartości od 0 do 8. Skutki polecenia dla wartości 0, 1, 2 oraz 3 możesz zobaczyć na odpowiednich rysunkach:

Spostrzeżenia

Pierwszy krok polega na wyodrębnieniu problemu. Jak widać po obrazkach rozmiar błękitnej planszy jest stały, więc istnieje potrzeba dostosowana wielkości elementów do planszy. Ponadto na każdym obrazku w środku jest żółty kwadrat o szerokości i wysokość równej dwóm najkrótszym odcinkom na rysunku. Wzór, który jest rysowana na kolejnych rysunkach począwszy od n większego od dwóch, składa się z powtarzającego się elementu, który jest rysowany 4(n - 1) razy.

Znaczek "L"

Rozwiązanie zadania najlepiej rozpocząć od najprostszego elementu. Są nim 3 połączone kwadraty tego samego koloru. Taki element jest 1/4 większego elementu. Odpowiednie napisanie procedury pozwoli ją wywołać w celu narysowania całości wzoru.

Procedura MOTYW_L przyjmuje cztery argumenty: :a - długość najkrótszego boku, :kRuch - kierunek ruchu czy kolejne linie mają być rysowane do przodu czy do tyłu, z założenia przyjmuje tylko wartości 1 i -1. W podobny sposób działa argument :kSkret - określa kierunek skrętu, dla 1 skręca w prawo, a dla -1 w lewo. Ostatni argument :kolor określa jakiego koloru element zostanie narysowany.

  1. oto MOTYW_L :a :kRuch :kSkret :kolor
  2.   ukp :kolor
  3.   ukm :kolor
  4.   wielokąt [
  5.     np (2*:a*:kRuch)
  6.     pw (90*:kSkret)
  7.     np (2*:a*:kRuch)
  8.     pw (90*:kSkret)
  9.     powtórz 2 [
  10.       np (:a*:kRuch)
  11.       pw (90*:kSkret)
  12.       np (:a*:kRuch)
  13.       lw (90*:kSkret)
  14.     ]
  15.     pw 180
  16.   ]
  17.   ukp "czarny
  18. już

Ustal kolor (2.) pisaka oraz (3.) malowania. (4. - 16.) Narysuj figurę. W przypadku poruszania się wartość pomnóż przez :kRuch, a w przypadku skrętu pomnóż przez :kSkret. (17.) Zresetuj pisak do domyślnego koloru.

Element wzoru

Posiadając procedure MOTYW_L można przejść do rysowania pierścienia wzoru. Przyjmuje argumenty: :a - najkrótszy bok elementu oraz :n - ile elementów wzoru koło siebie ma się znajdować.

  1. oto MOTYW_pom :a :n
  2.   pod
  3.   powtórz 4 [
  4.     powtórz :n [
  5.       MOTYW_L :a 1 1 "niebieski
  6.       pw 90
  7.       np :a
  8.       MOTYW_L :a 1 -1 "żółty
  9.       np 4*:a
  10.       MOTYW_L :a -1 1 "niebieski
  11.       np :a
  12.       pw 90
  13.       MOTYW_L :a -1 -1 "żółty
  14.       lw 180
  15.     ]
  16.     np :a*2
  17.     pw 90
  18.   ]
  19.   opu
  20. już

(3.) Narysuj cztery identyczne części: (4. - 15.) w każdej części rysuj :n elementów składających się z figur rysowanych przez procedurę MOTYW_L. (16. - 17.) Po narysowaniu boku przejdź do rysowania następnego.

Główna funkcja

  1. oto MOTYW :n
  2.   niech "h 460
  3.   niech "a :h / ((6 * :n) - 2)
  4.   pod
  5.   ws :h/2 pw 90
  6.   ws :h/2 lw 90
  7.   ukp "błękitny
  8.   wielokąt [
  9.     ukm "błękitny
  10.     powtórz 4 [
  11.       np :h
  12.       pw 90
  13.     ]
  14.   ]
  15.   ukp "czarny

Główną procedurę rozpocznij od (2.) ustalenia maksymalnej wielkości i (3.) wyliczenia najkrótszego boku. Następnie (4. - 6.) przejdź do rysowania kwadratu w tle i (7. - 14.) go narysuj. (15.) Zresetuj kolor pisaka.

  1.   pod
  2.   np :h - 3 * :a
  3.   pw 90
  4.   np :a
  5.   lw 90
  6.   opu
  7.   powtórz (:n - 1) [
  8.     MOTYW_pom :a (:n - npw)
  9.     pod
  10.     ws :a * 3
  11.     pw 90
  12.     np :a * 3
  13.     lw 90
  14.     opu
  15.   ]

(16. - 21.) Przejdź do rysowania pierścienia wzoru najbliżej krawędzi i (22. - 30.) narysuj :n - 1 pierścieni. Zakładamy, że :n - ty pierścień to kwadrat, który będzie rysowany w dalszej części kodu.

  1.   ukp "żółty
  2.   wielokąt [
  3.     ukm "żółty
  4.     powtórz 4 [
  5.       np (:a*2)
  6.       pw 90
  7.     ]
  8.   ]
  9.   ukp "czarny
  10. już

(31. - 38.) Narysuj żółty kwadrat i (39.) ustal kolor pisaka na czarny.

Zadanie 2

Napisz procedurę STRZAŁKI, która utworzy na środku ekranu możliwie duży rysunek układu strzałek, taki jak poniżej:

  1. oto STRZAŁKI
  2.   niech "h 460
  3.   niech "a :h / 13
  4.   pod
  5.   ws :h/2 pw 90
  6.   ws :h/2 lw 90
  7.   opu
  8.   powtórz 4 [
  9.     np :h
  10.     pw 90
  11.   ]
  12.   wróć
  13.   pod
  14.   lw 90
  15.   np :a * 3
  16.   pw 90
  17.   np :a * 2.5
  18.   opu

(2.) Ustal maksymalną wysokość i (3.) wylicz długość najkrótszego boku. (4. - 7.) Przesuń do rysowania ramki i (8. - 11.) ją narysuj. Potem (12.) wróć i (13. - 18.) przejdź do rysowania strzałek w lewym górnym rogu.

  1.   powtórz 4 [
  2.     powtórz 4 [
  3.       wielokąt [
  4.         ukm "jasnoszary
  5.         np (:a*2)
  6.         lw 90
  7.         np :a
  8.         pw 135
  9.         np (:a*1.5*pwk(2))
  10.         pw 90
  11.         np (:a*1.5*pwk(2))
  12.         pw 135
  13.         np :a
  14.         lw 90
  15.         np (:a*2)
  16.         pw 90
  17.         np :a
  18.         pw 90
  19.       ]
  20.       pw 90
  21.     ]
  22.     pod
  23.     np 0.5*:a
  24.     pw 90
  25.     np 5.5*:a
  26.     opu
  27.   ]
  28. już

(19.) Narysuj cztery grupy strzałek po (20.) cztery strzałki: (21. - 37.) Narysuj strzałkę i (38.) obkręć się w prawo. (40. - 44.) Po narysowaniu całej kolejnej grupy przejdź do rysowania kolejnej.

Zadanie 3

Filharmonia Narodowa w Warszawie - instytucja wielce zasłużona dla polskiej kultury - obchodzi w tym roku jubileusz stulecia istnienia. Napisz procedurę POSADZKA_FN, która tworzy na ekranie możliwie duży rysunek posadzki z holu warszawskiej filharmonii (taki jak poniżej).

Rozwiązanie w pliku do pobrania

Zadanie 4

Napisz procedurę SIATKA :n :x :y :rd, która tworzy na ekranie możliwie dużą siatkę n x n kwadratów z czarną dziurą.

Węzły - tzn. punkty przecięcia linii siatki - identyfikujemy za pomocą współrzędnych siatkowych. Przyjmujemy, że lewy dolny róg siatki ma współrzędne 0 0, a przeciwległy węzeł w prawym górnym rogu - ma współrzędne n n.

Czarna dziura powinna być kwadratem o lewym dolnym rogu w węźle o danych współrzędnych x oraz y i rozmiarze rd x rd kwadratów jednostkowych - oczek siatki, a w przypadku, gdy taki kwadrat nie mieści się na siatce - jego obcięciem do obszaru siatki.

Poniższy rysunek przedstawia skutki wywołania polecenia SIATKA 6 1 2 3, SIATKA 8 6 5 1, SIATKA 4 2 1 7 oraz SIATKA 8 2 6 5:

  1. oto SIATKA :n :x :y :rd
  2.   niech "h 460
  3.   niech "a :h / :n
  4.   pod
  5.   ws :h/2
  6.   pw 90
  7.   ws :h/2
  8.   lw 90
  9.   opu

Standardowo na początku: (2.) ustal maksymalny rozmiar rysunku i (3.) ustal bok małego kwadratu. Potem (4. - 9.) przejdź do lewego dolnego rogu. (W celu narysowania kwadratu o współrzędnych (0, 0)).

  1.   powtórz :n [
  2.     niech "pozY npw - 1
  3.     powtórz :n [
  4.       niech "pozX npw - 1
  5.       jeżeli (I :pozY >= :y :pozY < :y + :rd :pozX >= :x :pozX < :x + :rd) [
  6.         ukm "czarny
  7.       ][
  8.         ukm "biały
  9.       ]
  10.       wielokąt [
  11.         powtórz 4 [
  12.           np :a
  13.           pw 90
  14.         ]
  15.       ]
  16.       pod
  17.       pw 90
  18.       np :a
  19.       lw 90
  20.       opu
  21.     ]
  22.     pod
  23.     pw 90
  24.     ws :a * :n
  25.     lw 90
  26.     np :a
  27.     opu
  28.   ]
  29. już

(10.) Narysuj :n poziomów: (11.) zapamiętaj indeks poziomu i (12.) narysuj :n kwadratów. (13.) Zapamiętaj indeks kolumny. (14. - 18.) Sprawdź czy pole ma być zamalowane i na tej podstawie ustala kolor malowania. (19. - 24.) Narysuj kwadrat. (25. - 29.) Przejdź do rysowania kolejnego kwadratu. Po narysowaniu całego rzędu: (31. - 36.) wróć na początek rzędu i przejdź do rzędu wyżej.