Strona główna » Poradniki » Logomocja » LOGIA » Logia 1999/00 - Etap I
 

Logia 1999/00 - Etap I

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

Zadanie 1

Napisz procedurę ZIMOLUDEK, która utworzy na środku ekranu możliwie duży rysunek bałwanka takiego jak poniżej.

Rysowanie bałwanka nie wymaga użycia specjalnych składni. Niemalże wszystkie elementy są unikalne i tylko miejscami istnieje możliwość wykorzystania pętli. W przykładowym rozwiązaniu niektóre z użytych wartości są przykładowe i możliwa jest ich zmiana. Ze względu na fakt, że nie ma możliwości wyznaczenia dokładnych odległości (bez uzycia linijki lub programu graficznego) to najważniejsze jest, aby odpowiednie elementy były na odpowiedniej części rysunku. Kolejne etapy przykładowego rozwiązania to:

  1. oto ZIMOLUDEK
  2.   pod
  3.   np 40
  4.   okrąg 145
  5.   ws 160
  6.   okrąg 178
  7.   ws 70
  8.   powtórz 8 [
  9.     np 18
  10.     kropka 11
  11.   ]
  12.   np 18
  13.   powtórz 7 [
  14.     np 18
  15.     kropka 11
  16.   ]

(2.) Korekcja wyśrodkowania w pionie. Narysowanie (3.) środkowego koła i (4.) dolnego, a następnie narysowanie kropek na (8. - 11.) dolnym kole i (13. - 16.) środkowym kole. W tym przypadku użycie pętli jest wskazane w celu skrócenia długości kodu.

  1.   wróć
  2.   np 40
  3.   lw 55
  4.   np 105
  5.   okrąg 70
  6.   ws 105
  7.   pw 110
  8.   np 105
  9.   okrąg 70
  10.  
  11.   lw 45
  12.   ws 35
  13.   opu
  14.   ws 35
  15.   pod
  16.   np 105

(17.) Powrót do środka strony. W ten sposób znacznie przejść do rysowania rąk Zimoludka. (18.) Ze względu na ponowne przejście na początek rysowania korekta jest potrzebna po raz drugi. (19. - 21.) Narysowanie prawej ręki i (22.) powrót, a następnie (23. - 25.) przejście do rysowania lewej ręki. Ze względu na fakt, że w niej trzyma miotłę warto od razu przejść do jej narysowania. (29. - 32.) Narysowanie dolnej części miotły i przejście na drugą stronę ręki w celu jej dokończenia.

  1.   opu
  2.   np 35
  3.   lw 30
  4.   powtórz 10 [
  5.     np 35
  6.     ws 35
  7.     pw 6
  8.   ]
  9.   lw 30
  10.   pod
  11.   ws 70
  12.   pw 45
  13.  

(33.) Narysowanie dalszej części kija i (34. - 39.) dziesięciu włosków, a potem (40. - 45.) powrót do początku punktu rysowania.

  1.  
  2.   ws 105
  3.   lw 55
  4.   np 105
  5.   okrąg 70
  6.   np 10
  7.   lw 90
  8.   np 19
  9.   kropka 11
  10.   ws 38

(46.) Przejście do (47.) narysowania głowy oraz (48. - 55.) narysowania oczu.

  1.   kropka 11
  2.   np 19
  3.   pw 90
  4.   np 15
  5.   opu
  6.   ugp 2
  7.   lw 90
  8.   np 55
  9.   ws 110
  10.   np 55
  11.   ugp 1
  12.   pod
  13.   wielokąt[
  14.     powtórz 2[
  15.       np 30
  16.       pw 90
  17.       np 40
  18.       pw 90
  19.       np 30
  20.     ]
  21.   ]
  22.   opu
  23. już

(56.) Przejście do rysowania kapelusza, który składa się z (58. - 62.) poziomej linii o grubości 2 oraz (63. - 76.) czarnego prostokąta.

Zadanie 2

Napisz procedurę KLEPKA, która utworzy na środku ekranu możliwie duży rysunek przedstawiony poniżej.

Przedstawiona klepka składa się z czterech identycznych rysunków, a nawet wewnątrz wzór też się cztery powtarza chociaż niektóre fragmenty są obrócone.

  1. oto KLEPKA
  2.   niech "h 400
  3.   powtórz 4 [
  4.     powtórz 4 [
  5.       np :h/2
  6.       pw 90
  7.     ]
  8.     pod
  9.     np :h/4
  10.     pw 90
  11.     np :h/4
  12.     lw 90
  13.     opu
  14.     powtórz 4 [

(2.) Określ wysokość klepki i (3.) narysuj cztery takie same części: (4. - 7.) narysuj obramowanie ćwiartki rysunku, a następnie (8. - 13.) przesuń żółwia do środka rysowanej części.

  1.     powtórz 4 [
  2.       powtórz 5 [
  3.         niech "l npw
  4.         powtórz 2[
  5.           np :h*:l/24
  6.           pw 90
  7.           np :h*5/24
  8.           pw 90
  9.         ]
  10.       ]
  11.       pw 90
  12.     ]

(14.) Narysuj cztery części (15.) po 5 takich samych elementów. (16. - 22.) Rysowanie wzoru polega na rysowaniu prostokątów o coraz większej szerokości, a przejście do rysowania kolejnej części wzoru (24.) na obróceniu żółwia.

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

(26. - 44.) Ostatnią rzeczą do narysowania jest biały krzyżyk na wzorze. (45. - 50.) Na koniec iteracji wróć na środek strony i (51.) przejdź do rysowania kolejnej części.

Zadanie 3

Napisz procedurę PARZENICA :n z jednym parametrem, 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, odpowiednio taki jak poniżej. Parametr :n może przyjmować wartości od 1 do 10.
Poniżej przedstawione są rysunki uzyskane po wywołaniu PARZENICA 1, PARZENICA 3 oraz PARZENICA 5.

Założenia

Rysunek posiada oś symetrii, która wskazuje, że jedną i drugą cześć rysunku można narysować przy pomocy tej samej funkcji. Z tego powodu funkcja PARZENICA wywoła dwa razy funkcję PARZENICA_el.

  1. oto PARZENICA :n
  2.   niech "h 400
  3.   niech "a :h / (8 + 2 * :n)
  4.   pod
  5.   np :h/2
  6.   lw 90
  7.   np :a/2
  8.   lw 90
  9.   opu
  10.   PARZENICA_el :n :a 90
  11.   pod
  12.   lw 90
  13.   np :a
  14.   pw 90
  15.   opu
  16.   PARZENICA_el :n :a -90
  17. już

(2.) Określ wysokość rysunku. (3.) Wylicz wysokość najkrótszego odcinka. (4. - 9.) Przejdź do rysowania lewej części i (10.) ją narysuj, a potem (12. - 16.) przejdź do drugiej części i (17.) narysuj drugą.

Element

Procedura PARZENICA_el przyjmuje trzy argumenty: :n - złożoność rysunku, :a - jego wysokość oraz :s - kierunek rysowania. Wartość :s z założenia przyjmuje 90 oraz -10 w celu określenia kierunku skrętu jak również zwrotu rysowania. Każdy skręt zależy tylko od parametru :s.

  1. oto PARZENICA_el :n :a :s
  2.   powtórz :n [
  3.     np :a
  4.     pw :s
  5.     np :a * 2 * (:n - npw + 1)
  6.     lw :s
  7.     np :a
  8.     lw :s
  9.     np :a * 2 * (:n - npw + 1)
  10.     pw :s
  11.   ]
  12.   np :a * 3
  13.   powtórz :n [
  14.     np :a * 5
  15.     pw :s
  16.     np :a
  17.     pw :s
  18.     np :a * 7
  19.     lw :s
  20.     np :a
  21.     lw :s
  22.   ]
  23.   pw :s
  24.   np :a
  25.   pw :s
  26.   np :a * 3
  27.   pw :s
  28.   np :a * (:n * 2 + 1)
  29.   pw :s
  30.   pod
  31.   pw :s/2
  32.   ukm "szary10
  33.   np 3
  34.   zam
  35.   ws 3
  36.   lw :s/2
  37.   opu
  38. już

(2. - 11.) Narysuj :n poziomych wcięć. Następnie (12. - 22.) :n zwisających elementów, a potem (23. - 29.) wróć do początkowego miejsca rysowania. Pozostało teraz tylko (30. - 37.) zamalować element.

Zadanie 4

Te rysunki przedstawiają dwie piramidy ułożone z sześciennych klocków. Pierwsza ma dwa piętra, a druga pięć pięter.

Napisz procedurę PIRAMIDA :lp, która tworzy na środku ekranu możliwie duży rysunek piramidy o danej liczbie pięter :lp z zakresu od 1 do 6.

Założenia

Zadanie jest bardziej przejrzyste jeśli podzieli się je na kilka podprocedur: szescian narysuje pojedyczny sześcian zgodnie z rysunkiem. Potem szescian_linia narysuje całą linię sześcianów dowolnego stopnia :n. Ze względu na fakt, że ma powstać piramida to do rysowania poziomu o złożoności :n posłuży procedura szescian_pow, a szerokość sześcianu jak również narysowanie samej piramid wykona procedura PIRAMIDA.

Sześcian

Ze względu na fakt, że naprostszym sposobem rysowania piramidy jest rysowanie całego poziomu i nakładania na to kolejnego poziomu to funkcja szescian rysując sześcian o boku :a będzie zamalowywała pola używają polecenia wielokąt.

  1. oto szescian :a
  2.   wielokąt [
  3.     ukm "biały
  4.     powtórz 4[
  5.       np :a
  6.       pw 90
  7.     ]
  8.   ]
  9.   np :a
  10.   wielokąt [
  11.     ukm "szary
  12.     pw 60
  13.     np (:a/pwk(2))
  14.     pw 30
  15.     np :a
  16.     lw 30
  17.     ws (:a/pwk(2))
  18.   ]
  19.   pw 90
  20.   np :a
  21.   wielokąt [
  22.     ukm "niebieski3
  23.     lw 30
  24.     np (:a/pwk(2))
  25.     pw 120
  26.     np :a
  27.     pw 60
  28.     np (:a/pwk(2))
  29.   ]
  30.   ws :a
  31.   lw 90
  32.   ws :a
  33. już

(2. - 8.) Narysuj biały przód sześcianu, a nastepnie (9.) przejdź do (10. - 18.) rysowania szarej pokrywy. (19. - 20.) Przejdź do następnego boku i (21. - 29.) narysuj go. (30. - 32.) Na koniec wróć tam skąd została rozpoczęta procedura.

Linia sześcianu

Ze względu na fakt, że widać prawy bok sześcianu to należy rozpocząć rysować linię od lewej strony.

  1. oto szescian_linia :a :n
  2.   powtórz :n [
  3.     szescian :a
  4.     pw 90
  5.     np :a
  6.     lw 90
  7.   ]
  8.   pw 90
  9.   ws :a * :n
  10.   lw 90
  11. już

(2. - 7.) Narysuj linię sześcianów, a potem (8. - 10.) wróć tam skąd procedura została rozpoczęta.

Poziom piramidy

W celu prawidłowego nałożenia linii sześcianów składających się na poziom to należy rozpocząć rysowania od lini położonej najdalej na rysunku.

  1. oto szescian_pow :a :n
  2.   pw 60
  3.   np :a*(:n - 1)/pwk(2)
  4.   lw 60
  5.   powtórz :n [
  6.     szescian_linia :a :n
  7.     pod
  8.     pw 60
  9.     ws :a/pwk(2)
  10.     lw 60
  11.     opu
  12.   ]
  13.   pod
  14.   pw 60
  15.   np :a/pwk(2)
  16.   lw 60
  17.   opu
  18. już

(2. - 4.) Przesuń żółwia do rysowania poziomu i (5. - 12.) Narysuj :n lini pamiętając o (7. - 11.) prawidłowym przesunięciu. (13. - 17.) Wróć tam skąd została rozpoczęta procedura.

Piramida

W celu narysowania piramidy należy najpierw wyliczyć bok sześcianu, a potem przejść do rysowania rysunku. W tym przypadku wykorzystując jedynie procedurę szescian_pow.

  1. oto PIRAMIDA :lp
  2.   niech "h 400
  3.   niech "a :h / ((1 + 0.5/pwk(2))*:lp)
  4.   jeśli (:a > :h / ((1 + 0.5*pwk(3)/pwk(2))*:lp))[
  5.     niech "a :h / ((1 + 0.5*pwk(3)/pwk(2))*:lp)
  6.   ]
  7.   pod
  8.   ws :h/2
  9.   pw 90
  10.   ws (:a*(1.3 + pwk(3)/pwk(2))*(:lp)/2)
  11.   lw 90
  12.   opu
  13.   dopóki [:lp > 0][
  14.     szescian_pow :a 2*:lp-1
  15.     zmniejsz "lp
  16.     pod
  17.     np :a
  18.     pw 60
  19.     np :a/pwk(2)
  20.     lw 60
  21.     pw 90
  22.     np :a
  23.     lw 90
  24.     opu
  25.   ]
  26. już

(2.) Na podstawie wysokości (3.) wyliczyć bok :a i sprawdź (4. - 6.) czy rysunek zmieści się na szerokość. Jeśli nie to (5.) dokonaj korekty :a. (7. - 12.) Przejdź do rysowani rysunku. (13.) Dopóki jest wciąż poziom do narysowania tj. jest większ od 0 to (14.) narysuj go i (15.) zmniejsz zmienną :lp. (16. - 24.) Przejdź do rysowania kolejnego poziomu.