Strona główna » Poradniki » Logomocja » LOGIA » Logia 1997/98 - Etap I
 

Logia 1997/98 - Etap I

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

Zadanie 1

Napisz procedurę bez parametrów o nazwie RYBKA, która tworzy na środku ekranu możliwie duży następujący rysunek rybki złożony z łuków i odcinków prostoliniowych.

Wskazówka

Programowanie takich rysunków dobrze jest zacząć - dla uchwycenia właściwych proporcji - od szkicu na pokratkowanej kartce papieru.

Obrazek 1 do zadania 1

Rysunek składa się z prostych odcinków oraz łuków. Napisanie kodu rysującego kolejne części rysunku nie powinno stanowić problemu. Jednak przed przystąpieniem należy napisać procedurę luk, która będzie rysowała ćwierć okręgu. Procedura będzie przyjmowała dwa argumenty: :r - określa promień okręgu, którego fragment jest rysowany oraz :k - pozwoli zmienić kierunek rysowania. Dla wartości :k = 1 procedura narysuje fragment okręgu w prawo, a dla :k = -1 w lewo.

  1. oto luk :r :k
  2.   niech "n 90
  3.   powtórz :n[
  4.     np :r*3.14/2/:n
  5.     pw 90/:n*:k
  6.   ]
  7. już

(2.) W procedurze dodatkowo zadeklarowana jest zmienna :n. Pozwala ona sterować dokładność z jaką będzie rysowany łuk. (3.) Fragment koła będzie rysowane jako :n małych odcinków. (4.) Każdy odcinek ma długość , a (5.) kąt skrętu to

Główna funkcja RYBKA to lista kolejnych kroków rysowania obrazku. Warto tu jednak zwrócić uwagę na (2.) ustalenie wysokości obrazku, (3.) wyliczenie promienia okręgów.

  1. oto RYBKA
  2.   niech "h 400
  3.   niech "a :h/7
  4.   pod
  5.   ws :a/2
  6.   pw 90
  7.   ws :a*3.5
  8.   opu
  9.   np :a
  10.   lw 90
  11.   luk :a -1
  12.   pw 90
  13.   luk :a*2 1
  14.   lw 90
  15.   luk :a 1
  16.   pw 90
  17.   np :a
  18.   lw 90
  19.   luk :a 1
  20.   luk :a -1
  21.   luk :a -1
  22.   luk :a 1
  23.   pw 90
  24.   np :a*1.5
  25.   luk :a 1
  26.   pw 180
  27.   luk :a 1
  28.   np :a*1.5
  29.   pw 90
  30.   luk :a 1
  31.   luk :a -1
  32.   luk :a -1
  33.   luk :a 1
  34.   lw 90
  35.   np :a
  36.   pw 90
  37.   luk :a 1
  38.   lw 90
  39.   luk :a*2 1
  40.   pod
  41.   pw 90
  42.   np :a*2.5
  43.   lw 90
  44.   np :a*1.5
  45.   okrąg :a
  46. już

Zadanie 2

Napisz procedurę bez parametrów o nazwie ZNACZEK, która tworzy na ekranie możliwie duży następujący rysunek:

Obrazek 1 do zadania 2

Tym razem zadanie można podzielić na trzy procedury: pierwsza rysuje figurę przypominającą literę K, druga rysuje cztery takie figury tworzące pierścień, a ostatnia główna ZNACZEK narysuje większą i mniejszą część obrazu wynikowego. Procedura rysująca pojedynczą figurę wygląda następująco:

  1. oto ZNACZEK_k :a
  2.   wielokąt [
  3.     ukm "czarny
  4.     np :a
  5.     pw 45
  6.     np (:a*pwk(2))
  7.     lw 90
  8.     np (:a*pwk(2))
  9.     pw 45
  10.     np :a
  11.     pw 135
  12.     np (:a*pwk(2))
  13.     lw 135
  14.     np :a
  15.     pw 90
  16.     np :a
  17.     pw 90
  18.     np (:a*4)
  19.     pw 90
  20.     np :a
  21.     pw 90
  22.     np :a
  23.     lw 135
  24.     np (:a*pwk(2))
  25.     pw 135
  26.   ]
  27. już

Zastosowana funkcja wielokąt pozwala w wygodny sposób określić, że figura powinna być wypełniona czarnym kolorem.

Cztery takie same symbole są rysowane przy pomocy procedury ZNACZEK_4k. Warto zwrócić uwagę, że funkcja przyjmuje parametr :a, który określa szerokość najkrótszego odcinka w symbolu.

  1. oto ZNACZEK_4k :a
  2.   pod
  3.   ws :a*3
  4.   pw 90
  5.   ws :a*3
  6.   lw 90
  7.   opu
  8.   powtórz 4[
  9.     ZNACZEK_k :a
  10.     pod
  11.     np :a*6
  12.     pw 90
  13.     opu
  14.   ]
  15. już

(2. - 7.) Przesuwa w lewy dolny róg rysowanej części. (8.) Cztery razy jest: (9.) rysowany pojedynczy symbol i (10. - 13.) odpowiednio przesuwany żółw.

Ostatnia główna procedura ZNACZEK wygląda następująco:

  1. oto ZNACZEK
  2.   niech "h 400
  3.   niech "a :h/6
  4.   pod
  5.   ZNACZEK_4k :a
  6.   wróć
  7.   ZNACZEK_4k :a/3
  8. już

(2.) Ustalenie maksymalnej wysokości rysunku. (3.) Obliczanie długości najkrótszego odcinka w większym symbolu. (4.) Narysowanie większego pierścienia symboli. Następnie (5.) powrót i (6.) narysowanie 3 razy mniejszego fragmentu.

Zadanie 3

Rysunek przedstawia cztery siatki o złożoności odpowiednio 1, 2 oraz 3. Są one przykładami figur jednobieżnych; można je narysować bez odrywania ołówka od papieru, kreśląc każdy jednostkowy odcinek dokładnie jeden raz.

Napisz procedurę SIATKA :n rysowania w sposób jednobieżny takich siatek o dowolnym stopniu złożoności :n.

Po wywołaniu procedury SIATKA z dowolną wartością parametru :n od 1 do 10, żółw powinien wykreślić na ekranie możliwie duży rysunek siatki o złożoności :n. Powinien zacząć i skończyć kreślenie w tym samym węźle siatki i przebiec dokładnie jeden raz przez każdy jednostkowy odcinek siatki. Żółw powinien być widoczny, po narysowaniu każdego odcinka powinien odczekać chwilę, aby było widać, jak jest tworzona figura.

Obrazek 1 do zadania 3

Zadanie nie jest proste. W celu lepszego zrozumienia warto przekręcić rysunek o . Jeśli chodzi o sposób rysowania to proponuje zrobić to na podstawie gotowego kodu - każdy odcinek jest rysowany z drobnym opóźnieniem. (Zgodnie z treścią polecenia.)

Poniżej został przedstawiony kod aplikacji bez komentarza. W celu zrozumienia co po kolei rysuje linijka zapraszam do artykułu o figurach jednobieżnych i fragmentu Siatka kwadratów, gdzie po kliknięciu w obrazek zostanie odtworzona animacja rysowania figury.

  1. oto SIATKA :n
  2.   niech "h 400
  3.   niech "a :h/(:n*pwk(2))
  4.   pod
  5.   ws :h/2
  6.   pw 90
  7.   ws :h/2-:a/2*pwk(2)
  8.   lw 135
  9.   opu
  10.   powtórz (:n-1)[
  11.     powtórz (:n-npw+1)[
  12.       np :a
  13.       pw 90
  14.       czekaj 40
  15.       np :a
  16.       lw 90
  17.       czekaj 40
  18.     ]
  19.     powtórz (:n-npw)[
  20.       ws :a
  21.       pw 90
  22.       czekaj 40
  23.       ws :a
  24.       lw 90
  25.       czekaj 40
  26.     ]
  27.     ws :a
  28.     pw 90
  29.     czekaj 40
  30.     np :a
  31.     lw 90
  32.     czekaj 40
  33.   ]
  34.   powtórz 4[
  35.   np :a
  36.   pw 90
  37.   czekaj 40
  38.   ]
  39.   pw 180
  40.   powtórz (:n-1)[
  41.     powtórz (:n-npw)[
  42.       np :a
  43.       pw 90
  44.       czekaj 40
  45.       np :a
  46.       lw 90
  47.       czekaj 40
  48.     ]
  49.     powtórz (:n-npw-1)[
  50.       ws :a
  51.       pw 90
  52.       czekaj 40
  53.       ws :a
  54.       lw 90
  55.       czekaj 40
  56.     ]
  57.     ws :a
  58.     pw 90
  59.     czekaj 40
  60.     np :a
  61.     lw 90
  62.     czekaj 40
  63.   ]
  64. już

Zadanie 4

Umówmy się, że kwadrat dzielimy na n części w następujący sposób:

  • w pierwszym ruchu rozcinamy kwadrat pionowym odcinkiem na dwa przystające prostokąty,
  • w drugim ruchu prawy z tych prostokątów rozcinamy poziomym odcinkiem na dwa przystające kwadraty,
  • w trzecim ruchu dolny z tych dwóch kwadratów rozcinamy pionowym odcinkiem na dwa przystające prostokąty,
  • w czwartym ruchu prawy z tych prostokątów rozcinamy poziomym odcinkiem na dwa przystające kwadraty itd. aż otrzymamy n części.

Poniższy rysunek przedstawia podział kwadratu na odpowiednio 6 oraz 9 części.

Obrazek 1 do zadania 4

Napisz procedurę z jednym parametrem PODZIAŁ :n, która dla dowolnej wartości naturalnej :n, nie mniejszej niż 1 i nie większej niż 20, tworzy na środku ekranu możliwie duży rysunek kwadratu podzielonego na :n części (zgodnie z podanymi zasadami).

Uwaga. Twoja procedura może kreślić odcinki tworzące rysunek kwadratu podzielonego na :n części w dowolnej kolejności, ale ostateczny rezultat - rysunek na ekranie musi być zgodny z określonymi wyżej warunkami. Dla :n = 1 procedura powinna narysować odpowiednio duży (nie podzielony) kwadrat.

Podane zadanie najłatwiej wykonać w sposób iteracyjny. W zależności od parzystości numeru powtórzenia wystarczy narysować kolejny kwadrat, albo podzielić go na dwie części:

  1. oto PODZIAŁ :n
  2.   niech "h 400
  3.   pod
  4.   ws :h/2
  5.   pw 90
  6.   ws :h/2
  7.   lw 90
  8.   opu
  9.   powtórz :n[
  10.     jeżeli (reszta npw 2 = 1)[
  11.       powtórz 4[
  12.         np :h
  13.         pw 90
  14.       ]
  15.       pw 90
  16.       np :h/2
  17.       lw 90
  18.     ][
  19.       np :h
  20.       ws :h
  21.       niech "h :h/2
  22.     ]
  23.   ]
  24. już

(2.) Ustalamy maksymalną wysokość rysunku. (3. - 8.) Przesunięcie żółwia w lewy dolny róg obszaru rysowania. Potem (9.) :n razy: (10.) sprawdzamy czy numer powtórzenia jest nieparzysty. Jeśli tak to (11. - 14.) należy narysować kwadrat i (15. - 17.) przesunąć żółwia na środek jego dolnego boku, a żółwia ustawić pionowo do góry. (19.) Jednak jeśli numer powtórzenia jest parzysty to należy podzielić kwadrat na dwie równe części czyli: (19.) narysować kreskę o długości boku ostatnio rysowanego kwadratu, (20.) cofnąć się i (21.) zasygnalizować, że następny kwadrat ma być cztery razy mniejszy (czyli musi mieć każdy bok dwa razy krótszy).