Strona główna » Poradniki » Logomocja » LOGIA » Logia 2006/07 - Etap I
 

Logia 2006/07 - Etap I

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

Zadanie 1

Napisz bezparametrową procedurę GWIAZDA, która tworzy na środku ekranu rysunek przedstawiony poniżej.

Strategia

Rysunek składa się z sześciokątów oraz trójkątów zamalowanych różnymi kolorami. Pierwszym etapem rozwiązania będzie napisania dwóch procedur rysujących sześciokąt i trójkąt foremny o zadanym boku :a i zamalowanym na dany kolor :kolor. W celu uniknięcia zbędnego przesuwania w głównej procedurze obydwie procedury za środek figury przyjmują miejsce gdzie stoi żółw podczas rozpoczęcia procedury. Po narysowaniu żółw wraca do miejsca z którego rozpoczął rysowanie.

Rysowanie trójkąta

  1. oto GWIAZDA_trojkat :a :kolor
  2.   niech "h (:a*pwk(3))/2
  3.   pod
  4.   np :h*(2/3) pw 150
  5.   wielokąt [
  6.     ukp :kolor
  7.     ukm :kolor
  8.     powtórz 3 [
  9.       opu
  10.       kropka 16
  11.       pod
  12.       np :a
  13.       pw 120
  14.     ]
  15.   ]
  16.   lw 150 ws :h*(2/3)
  17.   opu
  18. już

Rysowanie sześcianu

  1. oto GWIAZDA_szesciokat :a :kolor
  2.   pod
  3.   np :a pw 120
  4.   wielokąt [
  5.     ukp :kolor
  6.     ukm :kolor
  7.     powtórz 6 [
  8.       np :a
  9.       pw 60
  10.     ]
  11.   ]
  12.   lw 120 ws :a
  13.   opu
  14. już

Główna procedura

Dwie funkcje pomocnicze pozwalają skupić się na wybraniu pozycji rysowania, a następnie dobraniu odpowiedniej wartości paramatru :a.

  1. oto GWIAZDA
  2.   niech "a 100
  3.   GWIAZDA_szesciokat (:a*pwk(3))/2 "czarny
  4.   niech "h (:a*pwk(3))/2
  5.   powtórz 6[
  6.     pod
  7.     np :h*(4/3)
  8.     opu
  9.     GWIAZDA_trojkat :a "czarny
  10.     pw 90
  11.     GWIAZDA_szesciokat :a/3 "biały
  12.     lw 90
  13.     GWIAZDA_szesciokat :h/3 "czarny
  14.     GWIAZDA_trojkat (:h/3*pwk(3)) "biały
  15.     pod
  16.     ws :h*(2/3)
  17.     opu
  18.     GWIAZDA_trojkat (:h/3*pwk(3)) "biały
  19.     pod
  20.     ws :h*(2/3)
  21.     opu
  22.     pw 60
  23.   ]
  24. już

(2.) Na początek warto ustalić pewną wartość względem której będą wyliczone pozostałe. W ten sposób zdecydowanie łatwiej będzie sterować wielkością obrazka. Określony bok :a dotyczy białego sześciokąta na boku którego zostały narysowane mniejsze trójkąty. (4.) Wylicz wysokość trójkata opisanego na boku. (5. - 23.) Narysuj sześć trójkątów na bokach: (6. - 8.) przejdź do środka trójkąta i (9.) narysuj duży czarny trójkąt. Następnie (10. - 12.) wpisz w niego biały sześciokąt, a w niego (13.) czarny sześciokąt. (14.) Dorysuj biały trójkąt. (15. - 17.) Cofnij, aby (18.) dorysować biały trójkat wewnątrz dużego, czarnego sześciokąta. Na koniec każdego powtórzenia (22.) należy obrócić żółwia o 60°.

Zadanie 2

W mauzoleum Galli Placydii znajduje się mozaika przedstawiająca grecki ornament. Napisz procedurę ORNAMENT :n, która tworzy na środku ekranu rysunki greckich ornamentów o stałej wysokości 60 pikseli. Dana :n określa złożoność ornamentu, może przyjmować wartości od 1 do 13. Rysunki poniżej przedstawiają ornamenty o złożoności 2 i 7.

ORNAMENT 2
ORNAMENT 7

Strategia

Schemat pomocniczy

Kluczem do szybkiego rozwiązania zadania jest wyodrębnienie powielanego wzoru. Po drugie warto zauważyć, że wzór można rozdzielić na dwie identyczny części obrócone o 180° co zostało pokazane na schemacie pomocniczym. Do narysowania pojedynczego wzorku służy procedura ORNAMENT_pom, która przyjmuje jeden argument :a, który określa długość najkrótszego odcinka.

  1. oto ORNAMENT_pom :a
  2.   powtórz 2 [
  3.     np :a*3 pw 90
  4.     np :a*2 pw 90
  5.     np :a lw 90
  6.     np :a lw 90
  7.     np :a*2 lw 90
  8.     np :a*7 lw 90
  9.     np :a*3 lw 90
  10.     pod
  11.     np :a
  12.     opu
  13.     powtórz 4 [
  14.       np :a*2
  15.       lw 90
  16.     ]
  17.     pod
  18.     ws :a pw 90
  19.     np :a
  20.     opu
  21.     lw 90
  22.     np :a*3 pw 90
  23.     np :a*2 pw 90
  24.     np :a pw 90
  25.     np :a lw 90
  26.     np :a*2 pw 90
  27.     pod
  28.     np :a pw 90
  29.     np :a*4 lw 90
  30.     opu
  31.     pw 180
  32.   ]
  33. już

Procedura główna

  1. oto ORNAMENT :n
  2.   niech "h 60
  3.   niech "a :h/8
  4.   pod
  5.   pw 90 ws :h * (:n - 1)/2
  6.   lw 90
  7.   opu
  8.   powtórz(:n)[
  9.     ORNAMENT_pom :a
  10.     pod
  11.     pw 90
  12.     np :h lw 90
  13.     opu
  14.   ]
  15. już

(2.) Określ maksymalną wysokość (na podstawie treści) i (3.) oblicz długość :a. Następnie (4. - 7.) przejdź z podniesionym pisakiem do pierwszego wzoru od lewej. Potem (8. - 14.) narysuj :n takich samych wzorków koło siebie przy użyciu procedury ORNAMENT_pom.

Zadanie 3

Napisz procedurę RAKIETA :h :p :k, rysującą na środku ekranu rakietę o wysokości :h. Rakieta zbudowana jest z następujących, zamalowywanych losowymi kolorami, figur geometrycznych: prostokątów o wysokości dwa razy mniejszej niż szerokość (parametr :p określa liczbę prostokątów), jednego trapezu równoramiennego (długości ramion oraz górnej podstawy są dwa razy mniejsze niż długość dolnej podstawy), kwadratów (parametr :k określa liczbę kwadratów) oraz jednego trójkąta równobocznego. Długości boków kwadratów, trójkąta, górnej podstawy trapezu oraz wysokości prostokątów są takie same. Parametr :h może przyjmować wartości od 100 do 400, parametry :p i :k od 0 do 10.

RAKIETA 200 0 0
RAKIETA 200 1 1
RAKIETA 200 2 4

Rozwiązanie

Przyjmując wysokość rakiety za stałą zmieniać się będzie szerokość każdego z elementów. Przede wszystkim bok kwadratu będzie wtedy maksymalna wysokością podzieloną przez :a = 2 + :k + :p. Dłuższy bok prostokąta to wtedy 2:a. Pierwszy etap polega na przejściu w lewy dolny róg rysunku po uprzednim (2.) wyliczeniu boku :a.

  1. oto RAKIETA :h :p :k
  2.   niech "a :h/(2+:p+:k)
  3.   pod
  4.   ws :h/2 pw 90
  5.   ws :a lw 90
  6.   opu

Drugi etap polega na (7. - 18.) narysowaniu :p prostokątów, (19. - 25.) trapezu i (26. - 27.) przejścia do rysowania kwadratów.

  1.   powtórz (:p) [
  2.     wielokąt [
  3.       ukm jld
  4.       powtórz 2[
  5.         np :a
  6.         pw 90
  7.         np (2*:a)
  8.         pw 90
  9.       ]
  10.     ]
  11.     np :a
  12.   ]
  13.   wielokąt [
  14.     ukm jld
  15.     pw 30 np :a
  16.     pw 60 np :a
  17.     pw 60 np :a
  18.     pw 120 np (2*:a)
  19.   ]
  20.   pw 30 np :a
  21.   lw 30

Ostatni etap polega składa się z (28. - 37.) narysowaniu :k kwadratów, a na koniec (38. - 43.) trójkata równobocznego.

  1.   powtórz (:k) [
  2.     wielokąt [
  3.       ukm jld
  4.       powtórz 4[
  5.         np :a
  6.         pw 90
  7.       ]
  8.     ]
  9.     np :a
  10.   ]
  11.   wielokąt [
  12.     ukm jld
  13.     pw 30 np :a
  14.     pw 120 np :a
  15.     pw 120 np :a
  16.   ]
  17. już

Zadanie 4

Figury przedstawione na rysunkach poniżej to przykłady wielostrzałek, o różnych stopniach złożoności: 1, 2, 3 oraz 12. Napisz procedurę STRZAŁKI :n rysowania wielostrzałek o dowolnym stopniu złożoności :n. Po wywołaniu procedury STRZAŁKI z dowolną wartością parametru :n, nie mniejszą niż 1 i nie większą niż 25, na ekranie powinien powstać rysunek wielostrzałki o złożoności :n. Szerokość rysowanej figury jest stała - niezależnie od stopnia złożoności wynosi 250 pikseli.

STRZAŁKI 1
STRZAŁKI 2
STRZAŁKI 3
STRZAŁKI 12

Strzałka

Schemat pomocniczy

Narysowanie strzałki może przysporzyć problemów, dlatego do rozwiązania został załączony obrazek pomocniczy. Żółw rozpoczyna i kończy procedurę w punkcie zielonym, a po wstępnym przesunięciu rysowanie rozpoczyna w punkcie czerwonym skierowany w dół. Zmienna :a określa szerokość i wysokość kratki, a zmienna :b to przekątna kwadratu o bokach :a × :a.

  1. oto STRZAŁKI_pom :a
  2.   niech "b :a*pwk(2)
  3.   pod
  4.   np :a*3 lw 90
  5.   np :a*1.5 lw 90
  6.   opu
  7.   wielokąt [
  8.     ukm "czarny
  9.     np (:a*3) pw 135
  10.     np :b lw 135
  11.     np (:a*3) lw 45
  12.     np (:b*2.5) lw 90
  13.     np (:b*2.5) lw 45
  14.     np (:a*3) lw 135
  15.     np :b pw 135
  16.     np (:a*3) lw 135
  17.     np :b lw 45
  18.     np (:a*3.5) lw 135
  19.     np :b pw 135
  20.     np (:a*1.5) pw 45
  21.     np (:b*1.5) pw 90
  22.     np (:b*1.5) pw 45
  23.     np (:a*1.5) pw 135
  24.     np :b lw 135
  25.     np (:a*3.5)
  26.   ]
  27.   pod
  28.   pw 90 ws :a*1.5
  29.   pw 90 ws :a*3
  30.   opu
  31. już

Główna funkcja

Jednym z głównych problemów może okazać się wyliczenie wartości zmiennej :a. Warto zauważyć, że dla złożoności 1 rysowanych jest 5 kolumn. Dla złożoności 2 jest 8, dla 3 jest 11 itd. Wzór opisujący zależność liczby kolumn od złozoności :n to 5 + (n - 1)·3 = 2 + 3n.

  1. oto STRZAŁKI :n
  2.   niech "w 250
  3.   niech "a (:w/(5 + 3*(:n - 1)))
  4.   pod
  5.   pw 90
  6.   ws :w/2 - :a*2.5
  7.   opu
  8.   powtórz (:n) [
  9.     jeżeli(reszta npw 2)[
  10.       skieruj 0
  11.     ][
  12.       skieruj 180
  13.     ]
  14.     STRZAŁKI_pom :a
  15.     pod
  16.     skieruj 90
  17.     np :a*3
  18.     opu
  19.   ]
  20. już

(2.) Maksymalna szerokość :w obrazka to 250 (z treści). Na tej podstawie można obliczyć wartość zmiennej (3.) :a. (4. - 7.) Przesuń do środka pierwszej strzałki. (8. - 19.) Narysuj :n strzałek rozrózniąjąc (9.) strzałki skierowane w dół oraz do góry sprawdzając parzystość numeru powtórzenia.