Strona główna » Poradniki » Logomocja » LOGIA » Logia 2002/03 - Etap I
 

Logia 2002/03 - Etap I

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

Napisz procedurę KT :bok, która tworzy na środku ekranu rysunek przedstawiony poniżej. Parametr :bok określa długość boku największego, zewnętrznego kwadratu.

Strategia

Gdyby nie fakt, że w każdym okienku jest inny obrazek to można by napisać funkcję, która powtarza rysowanie 9 identycznych pól poprzez pętle powtórzeń po 3. Nie oznacza to jednak, że w tym przypadku nie można tego zastosować. Wystarczy jedynie na podstawie pozycji pola określić jakie powinno być wypełnienie i takie narysować.

Kod

KT jest to procedura, która nie polega na żadnych funkcjach pomocniczych.

  1. oto KT :bok
  2.   niech "a :bok / 3
  3.   pod
  4.   ws :a pw 90
  5.   ws :a lw 90
  6.   opu

Na początek (2.) ustalany jest bok kwadratów w siatce. (3. - 6.) przesuń żółwia do lewego, dolnego kwadratu. Warto zauważyć, że przesunięcie jest do środka tego pola, a nie jego któregoś rogu.

  1.   powtórz 3 [
  2.     niech "numerwiersza npw
  3.     powtórz 3 [
  4.       pod
  5.       ws :a / 2 lw 90
  6.       opu
  7.       powtórz 4 [
  8.         np :a / 2
  9.         pw 90
  10.         np :a / 2
  11.       ]
  12.       pod
  13.       pw 90 np :a / 2
  14.       opu

Rozpoczynamy rysowanie pól: (7.) Narysuj trzy wiersze. Za każdym razem (8.) zapamiętaj numer rysowanego wiersza i (9.) narysuj w wierszu trzy pola. Pierwszy etapem rysowania pola jest (10. - 20.) narysowanie obramowania. Należy pamiętać, że żółw przed rozpoczęciem znajduje się w środku obszaru.

  1.       jeżeli (reszta (:numerwiersza + npw ) 2 = 0)[
  2.         wielokąt [
  3.           powtórz 4 [
  4.             np (:a / 2)
  5.             lw 135
  6.             np (:a * (pwk(2) / 16))
  7.             pw 135
  8.             powtórz 4 [
  9.               np (:a / 4)
  10.               lw 90
  11.             ]
  12.             pw 135
  13.             np (:a * pwk(2) / 16)
  14.             lw 45
  15.           ]
  16.         ]

Drugi etap rysowania (21.) polega na wyborze co powinno zostać umieszczone w polu. W przypadku, gdy suma numeru wiersza oraz numeru kolumny jest parzysta to obie współrzędne są parzyste, albo nieparzyste. Wtedy należy narysować wiatraczek z kwadratami.

  1.       ][
  2.         ws :a / 2
  3.         lw 45
  4.         wielokąt [
  5.           powtórz 4 [
  6.             np (:a * pwk(2) / 4)
  7.             pw 90
  8.           ]
  9.         ]
  10.         pw 45
  11.         np :a / 2
  12.       ]
  13.       pod
  14.       pw 90
  15.       np :a
  16.       lw 90
  17.       opu
  18.     ]
  19.     pod
  20.     pw 90 ws :a * 3
  21.     lw 90 np :a
  22.     opu
  23.   ]
  24. już

(37.) Jednak w przypadku, gdy pole ma współrzędne o różnej parzystości to wystarczy narysować czarny, obrócony kwadrat. Program, aby poprawnie wykonał rysunek musi jeszcze (49. - 53.) przesuwać żółwia w prawo po narysowaniu każdego pola, a po narysowaniu całego wiersza (55. - 58.) o jeden poziom wyżej i przejść do pierwszej kolumny.

Zadanie 2

Figury przedstawione na rysunku niżej to przykłady tak zwanych plastrów, o różnych stopniach złożoności: 3, 4 oraz 8.

Napisz procedurę PLASTER :n rysowania plastrów o dowolnym stopniu złożoności :n. Po wywołaniu procedury PLASTER z dowolną wartością parametru :n, nie mniejszą niż 1 i nie większą niż 10, na ekranie powinien powstać rysunek plastra o złożoności :n.

Strategia

Przed rozpoczęciem pisania głównej procedury warto zastanowić się jakie zależności zachodzą pomiędzy kolejnymi wierszami. Z pewnością nietrudno zauważyć, że w każdym wierszu jest o jeden sześciokąt mniej. Sześciokąt można podzielić na 6 mniejszych, równych trójkątów. Na tej podstawie łatwo stwierdzić, że każdy kolejny wiersz jest przesunięty w prawo względem poprzedniego o wysokość jednego z takich trójkątów.

Sześciokąt

Powtarzającym się elementem rysunku jest sześciokąt, dlatego warto napisać procedurę pomocniczą PLASTER_el, która narysuje sześciokąt o zadanej długości boku :a.

  1. oto PLASTER_el :a
  2.   lw 60
  3.   powtórz 6 [
  4.     np :a
  5.     pw 60
  6.   ]
  7.   pw 60
  8. już

Piramida

Procedura rysująca piramidę sześciokątów wygląda następująco:

  1. oto PLASTER :n
  2.   niech "h 460
  3.   niech "a :h / (:n * 1.5 + 0.5)
  4.   niech "ht :a * pwk(3) / 4
  5.   pod
  6.   ws :h/2 pw 90
  7.   ws (:n - 1) * :ht lw 90
  8.   opu

(2.) Określ wysokość strony. (3.) Oblicz bok sześciokąta i na tej podstawie (4.) wysokość trójkątów w tym sześciokącie. Potem (5. - 8.) przejdź do rysowania pierwszego wiersza.

  1.   powtórz :n [
  2.     niech "numerpow :n - npw + 1
  3.     powtórz (:numerpow) [
  4.       PLASTER_el :a
  5.       pod
  6.       pw 90 np :ht * 2
  7.       lw 90
  8.       opu
  9.     ]
  10.     pod
  11.     np :a * 1.5 lw 90
  12.     np (:ht * 2) * (:numerpow - 0.5) pw 90
  13.     opu
  14.   ]
  15. już

Drugi etap polega na (9.) narysowaniu :n wierszy. (10.) Oblicz ile plastrów znajdzie się w rysowanym wierszu i (11. - 17.) narysuj wszystkie. (18. - 21.) Po zakończeniu rysowania wiersza przejdź do następnego.

Zadanie 3

Napisz bezparametrową procedurę KO, która tworzy możliwie duży losowy rysunek, złożony z dwunastu figur. Wewnętrzne figury są okręgami, a zewnętrzne - kwadratami o bokach równoległych do krawędzi ekranu. Co drugi obszar pomiędzy sąsiednimi figurami jest zamalowany na czarno. Obszar wewnątrz najmniejszego okręgu jest biały. Rysunek zawiera co najmniej jeden okrąg i co najmniej jeden kwadrat. Poniżej pokazane są trzy przykładowe rysunki, z wielu jakie mogą powstać po wywołaniu procedury KO. Stosunki wielkości kolejnych figur powinny być takie, jak na przykładowych rysunkach.

Strategia

Do rysowania kół można użyć polecenie kropka. Problem jednak pojawia się w przypadku rysowania wyśrodkowanego kwadratu, ale wystarczy napisać do tego specjalną procedurę. Poza tym do losowania wystarczy użyć polecenie losowa, a czarny i biały kolor ustalać na podstawie parzystości numeru rysowanej figury.

Wyśrodkowany kwadrat

Procedura wyśrodkowanego kwadratu przyjmuje dwa parametry :a - bok rysowanego kwadratu oraz :kolor - na jaki kolor ma zostać zamalowany kwadrat.

  1. oto KO_kwadrat :a :kolor
  2.   pod
  3.   ws :a / 2 pw 90
  4.   ws :a / 2 lw 90
  5.   opu
  6.   wielokąt [
  7.     ukm :kolor
  8.     powtórz 4 [
  9.       np :a
  10.       pw 90
  11.     ]
  12.   ]
  13.   pod
  14.   np :a / 2 pw 90
  15.   np :a / 2 lw 90
  16.   opu
  17. już

Główna procedura

Kod procedury KO wygląda następująco:

  1. oto KO
  2.   niech "hmax 460
  3.   niech "hroznica :hmax / 12
  4.   niech "kwa (losowa 11) + 1
  5.   niech "kolory ["czarny "biały]
  6.   powtórz 12 [
  7.     niech "kolor element ((reszta npw 2) + 1) :kolory
  8.     jeżeli (npw <= :kwa)[
  9.       KO_kwadrat :hmax :kolor
  10.     ][
  11.       ukp :kolor
  12.       kropka :hmax
  13.     ]
  14.     niech "hmax :hmax - :hroznica
  15.   ]
  16. już

(2.) Ustal maksymalną wysokość rysunku i oblicz (3.) różnice pomiędzy kolejnymi figurami. (4.) Wylosuj ile będzie kwadratów pamiętając, że ma być conajmniej jeden, a maksymalnie 11. (5.) Zadeklaruj z jakich kolorów będzie składał się rysunek. (6.) Narysuj 12 figur: (7.) wybierz kolor figury. (8.) Na podstawie numeru powtórzenia: (9.) narysuj kwadrat, albo (11. - 12.) koło. (14.) Po narysowaniu każdej figury zmniejsz szerokość figury o wyliczoną na początku wartość.

Zadanie 4

Część A

Napisz procedurę PLECIONKA, która tworzy możliwie duży poniższy rysunek trójkolorowej plecionki.

Część B

Napisz procedurę PASEK :n, która tworzy możliwie duży rysunek plecionego paska. Parametr :n określa liczbę elementów składających się na pasek, analogicznych jak w punkcie A, ale co drugi element ma zamienione kolory. Poniższy, przykładowy rysunek pokazuje, co powstanie po wywołaniu PASEK 4.

Strategia

Ze względu na fakt, że wzór powtarza się w procedurze PLECIONKA oraz PASEK to pojedynczy element rysować będzie procedura PLECIONKA_wzor, która przyjmie 4 argumenty :a - szerokość kwadratu oraz :kolor1, :kolor2, :kolor3 - kolory odpowiednich elementów. Dzięki temu zmiana kolorów w kolejnych częściach plecionki stanie się prostsze.

Wzór

Rysowanie wzoru to długa procedura, która nakłada na siebie kolejne warstwy odpowiednich elementów w odpowiednim kolorze. Procedura rozpoczyna się od (2.) podzielenia rysunku na siatkę 3x3 i (3.) wyliczeniu przekątnej powstałych kwadratów. Potem (4. - 11.) rysowany jest kwadrat znajdujący się w tle plecionki.

  1. oto PLECIONKA_wzor :a :kolor1 :kolor2 :kolor3
  2.   niech "am :a / 3
  3.   niech "as :am * (pwk(2) / 4)
  4.   ukp :kolor1
  5.   wielokąt [
  6.     ukm :kolor1
  7.     powtórz 4 [
  8.       np :a
  9.       pw 90
  10.     ]
  11.   ]

Następnie rysowane są czarne pasku, które może tego nie widać na pierwszy rzut oka można narysować (12.) powtarzając pewne instrukcje dwa razy. (13. - 23.) Najpierw rysowany jest czarny element wypełniający kwadrat aż do rogu. Potem procedura (24.) przechodzi w róg powyżej i (25. - 34.) rysuje drugi czarny element. Potem (35. - 38.) wystarczy przejść do następnego rogu i wywołać te same instrukcje, aby narysować wszystkie czarne elementy.

  1.   ]
  2.   powtórz 2 [
  3.     ukp :kolor2
  4.     wielokąt [
  5.       ukm :kolor2
  6.       np (:am / 2)
  7.       pw 45
  8.       np (:as * 2)
  9.       pw 90
  10.       np :as
  11.       pw 90
  12.       np (:as * 2)
  13.     ]
  14.     pod np :a / 2 opu
  15.     wielokąt [
  16.       ukm :kolor2
  17.       np :am
  18.       pw 45
  19.       np :as
  20.       pw 45
  21.       np :am
  22.       pw 135
  23.       np (:as * 3)
  24.     ]
  25.     pod
  26.     np :a / 2 pw 90
  27.     np :a pw 90
  28.     opu
  29.   ]

Ostatni etap polega na (44. - 57.) na rysowaniu białych kwadratów. (58. - 61.) powrotu do lewego dolnego rogu rysunku i (62.) resecie koloru pisaka.

  1.   pod
  2.   np :am * 1.5
  3.   pw 45
  4.   opu
  5.   powtórz 4 [
  6.     ukp :kolor3
  7.     wielokąt [
  8.       ukm :kolor3
  9.       powtórz 4 [
  10.         np :as
  11.         pw 90
  12.       ]
  13.     ]
  14.     pod
  15.     np :as * 3
  16.     pw 90
  17.     opu
  18.   ]
  19.   pod
  20.   lw 45
  21.   ws :am * 1.5
  22.   opu
  23.   ukp "czarny
  24. już

Plecionka (część A)

Mają już napisaną procedurę rysującą wzór wystarczy w procedurze PLECIONKA (2.) ustalić wysokość rysunku, (3. - 6.) przejść do rysowania i (7.) wywołać procedurę rysującą wzór z odpowiednimi parametrami.

  1. oto PLECIONKA
  2.   niech "h 460
  3.   pod
  4.   ws :h/2 pw 90
  5.   ws :h/2 lw 90
  6.   opu
  7.   PLECIONKA_wzor :h "szary "czarny "biały
  8. już

Pasek (część B)

Rysowania paska ma podobny schemat do plecionki, ale wymaga pewnych warunków.

  1. oto PASEK :n
  2.   jeśli (:n = 1)[
  3.     PLECIONKA
  4.     stop
  5.   ]
  6.   niech "h 460
  7.   niech "w 760
  8.   niech "a maksimum :h/:n :w/:n
  9.   pod
  10.   ws :a/2 pw 90
  11.   ws :a*:n/2 lw 90
  12.   opu
  13.   powtórz :n [
  14.     jeżeli (reszta npw 2 = 0)[
  15.       PLECIONKA_wzor :a "szary "czarny "biały
  16.     ][
  17.       PLECIONKA_wzor :a "czarny "szary "biały
  18.     ]
  19.     pod
  20.     pw 90 np :a
  21.     lw 90
  22.     opu
  23.   ]
  24. już

Po pierwsze (2.) dla :n = 1 wystarczy narysować PLECIONKA. Jeśli nie to (15., 16.) należy ustalić obszar rysowania. i (17.) wybrać większą z wyliczonych długości. (18.) Przejść do rysowania i (22.) narysować :n elementów plecionki. Jednak należy rozpoznać parzyste i nieparzyste elementy paska, ponieważ rysując z tym samym schematem pasek nie będzie miał jednolitego wzoru.