Dołącz do czytelników
Brak wyników

Matematyka dawniej i dziś

15 maja 2019

NR 38 (Maj 2019)

O smokach, drzewach i płatkach śniegowych (cz. 2)

0 114

W artykule z poprzedniego numeru „Matematyki”, 2/2019 (29), opowiedzieliśmy, w jaki sposób, wykorzystując Geometer’s Sketchpad, prosty program do nauczania geometrii szkolnej, możemy wykonać iteracje obiektów geometrycznych. W tym artykule dokończymy temat iteracji geometrycznych i opowiemy o paru ważnych wydarzeniach i odkryciach w matematyce z końca ubiegłego wieku.

L-systemy

Jeśli dokładnie się zastanowimy nad przykładami z poprzedniej części tego artykułu, to zauważymy, że są one wszystkie bardzo podobne. W każdym z nich tworzymy pewien kształt zbudowany z odcinków, a następnie zastępujemy każdy z istniejących odcinków tym właśnie kształtem. Proces ten powtarzamy wielokrotnie, aż do otrzymania pewnego, na ogół dość skomplikowanego, obiektu. Takie obiekty nazywamy L-systemami. Dla przykładu konstrukcja płatka Kocha daje się opisać symbolicznie jako L-system w następujący sposób:

  • kąt: 60 stopni,
  • figura początkowa: F (odcinek),
  • reguły: F → F-F++F-F.

Symbolika użyta tu do opisu L-systemów została opisana w monografii Prusinkiewicza i Lindemayera1. Jej źródeł można się doszukiwać w paru wcześniejszych pracach innych autorów. Najbardziej klasyczny przykład L-systemu podaje von Koch w roku 1905 i stąd mamy znany nam już płatek Kocha. U Mandelbrota2 znajdziemy doskonały werbalny opis konstrukcji płatka von Kocha.

Zwróćmy uwagę na to, co mamy w symbolicznym zapisie płatka Kocha. Mamy tu pewien kąt. Jak możemy się domyślić, jest to kąt pomiędzy sąsiednimi odcinkami. Dalej jest zrozumiała rzecz – figura początkowa. Oczywiście, figura początkowa może być bardziej skomplikowana niż jeden odcinek. Wreszcie następuje reguła mówiąca, jaką konstrukcją należy zastąpić każdy odcinek przed przejściem do kolejnego obrazu iteracji. Przy czym znak „−” oznacza kąt w lewo, a znak „+” kąt, ten sam zresztą, ale w drugą stronę. Reguł zastępowania, bo tak się je nazywa, może być znacznie więcej i mogą być niezmiernie skomplikowane. Czytelnicy znający grafikę żółwia mogą przetłumaczyć ten zapis na język żółwia, tego z LOGO, w następujący sposób:

  • F rysuj odcinek,
  • − skręć w lewo o 60 stopni,
  • + skręć w prawo o 60 stopni.

Domyślamy się, że ++ oznacza komendę skręć w prawo o 60 + 60 stopni, czyli 120.

Nazwa L-systemy pochodzi od nazwiska Aristida Lindenmayera, rzeczywistego twórcy L-systemów. To właśnie Lindenmayer, biolog zajmujący się modelowaniem organizmów żywych, w tym bakterii i roślin, wymyślił i stosował ten system. To z kolei pozwoliło na zastosowanie grafiki komputerowej do tworzenia realistycznej wizualizacji struktur roślinnych oraz ich rozwoju. Dzięki badaniom Lindenmayera i innych możemy teraz na filmach realizowanych za pomocą grafiki komputerowej oglądać magicznie wyrastające drzewa, kwiaty i wiele podobnych w strukturze obiektów. Ciekawe jest również to, że L-systemy znalazły kilka innych, nieco zaskakujących zastosowań. Dla przykładu niemiecki kompozytor urodzony w Nigerii, Hanspeter Kyburz, stosował je w muzyce.

Czytelnik zainteresowany wizualizacją L-systemów może odszukać w internecie kilka różnych narzędzi, pozwalających na wpisywanie symbolicznego kodu w postaci pokazanej na początku tego tekstu i otrzymać obraz na dowolnym kroku iteracji. Jednym z najłatwiejszych w użyciu jest program na stronie Demos, images and music autorstwa Kevina Roasta, patrz //www.kevs3d.co.uk/dev/lsystems/.

 


 
W podobny sposób, choć czasem nieco bardziej skomplikowany, można opisać pozostałe przykłady z pierwszej części tego tekstu. Za pomocą tej samej strony www możemy stworzyć wiele innych figur, a każda z nich dostarczy nam wiele materiału do pracy z uczniami. Oto jedna z takich figur z pokazanym elementem początkowym. Pytania dla uczniów będą podobne jak w poprzednich przykładach.

Krzywa kapeluszowa
 


Dwa różne stadia rozwoju krzywej kapeluszowej
Górny rysunek pokazuje krzywą kapeluszową po jednym kroku iteracji. Pogrubione linie są elementem początkowym i jednocześnie generatorem iteracji krzywej kapeluszowej. W kolejnych krokach każdy odcinek zastępujemy takim właśnie kapeluszem.
Na dolnej rycinie mamy krzywą kapeluszową po czterech krokach iteracji. W tym przypadku narysowaliśmy tylko obraz końcowy, bez generatora. W dalszych krokach krzywa będzie coraz bardziej się zagęszczała, tworząc duże puste kwadraty.
Zastosowaliśmy tu regułę zastępowania F=F+F−F−F+F z kątem 90 stopni.

Pokazana tu krzywa kapeluszowa może mieć znacznie bardziej interesującą postać, jeśli zamiast kąta 90 stopni weźmiemy kąt zbliżony, np. 85 lub 95 stopni.
 

Narzędzie do wizualizacji L-systemów na stronie Demos, images and music by Kevin Roast
Mamy tu dokładnie to, o czym wspomnieliśmy wcześniej: liczbę iteracji, kąt, aksjomat, czyli element początkowy, oraz regułę. Jedyna różnica jest taka, że symbol strzałki został zastąpiony znakiem równości.
Zauważmy również, że element początkowy, tu określany jako aksjomat, składa się z trzech odcinków, a to dlatego, że kompletny płatek Kocha zbudowany jest na trójkącie równobocznym i wtedy jest obiektem zamkniętym.
Wreszcie warto zauważyć, że mamy tu możliwość wpisania pięciu reguł, co pozwala nam tworzyć bardzo złożone obiekty.


Wyspa Kocha w wielu wydaniach

Przypuszczam, że uważni Czytelnicy zauważyli, iż krzywa kapeluszowa jest niczym innym jak modyfikacją wyspy Kocha, którą zamieściliśmy jako ostatni przykład w pierwszej części tego artykułu. Takich modyfikacji jest znacznie więcej i wiele z nich opisał między innymi Mandelbrot w książce The Fractal geometry of nature2. Popatrzmy na nie uważniej.

Trzy kolejne iteracje wyspy Kocha
Na pokazanych tu rycinach mamy trzy kolejne iteracje wyspy Kocha. Kod tego L-systemu składa się z następujących elementów:

  • odcinek: F,
  • krzywa początkowa: F+F+F+F, czyli po prostu kwadrat,
  • reguła iteracji: F=F+F−F−FF+F+F−F.

Jak łatwo można zauważyć, nasza reguła iteracji daje nam obiekt pokazany obok. Jest to właśnie to, czym zastępujemy pojedynczy odcinek. Reguła iteracji jest dość skomplikowana, ale to, co otrzymujemy z wizualnego punktu widzenia, jest dość proste. Teraz możemy sprawdzić, co będzie się działo, jak zaczniemy modyfikować regułę iteracji.

 


Na kolejnych rysunkach znajdziemy obiekt, który powstał w wyniku stosunkowo niewielkich modyfikacji kodu wyspy Kocha. Nowa reguła dla tego L-systemu ma postać: F=FF−F−F−F−F−F+F. Pozostałe parametry są dokładnie takie same, jak dla oryginalnego L-systemu.
 

Modyfikacja wyspy Kocha, iteracje 1, 2, 3 i 4
Tu mamy regułę w postaci: F=FF−F−F−F−F−F+F.

Kolejny przykład modyfikacji wyspy Kocha jest dość rzadko spotykany w literaturze. Proponuję, aby Czytelnik narysował samodzielnie generator tego L-systemu, bez spoglądania na załączony kod reguły zastępowania.
 

Inna modyfikacja wyspy Kocha, iteracje 1, 2, 3 i 4
Tu mamy regułę w postaci: F=FF−F+F−F−FF. 

Na zakończenie rozważań dotyczących wyspy Kocha proponuję zbadać inny, również stosunkowo mało znany wariant tego L-systemu.

Inna modyfikacja wyspy Kocha, iteracje 1, 2, 4 i 5
W tym L-systemie mamy regułę w postaci: F=FF−F−−F−F oraz element początkowy w postaci F−F−F−F (zamiast dotychczasowego F+F+F+F). Chodzi tu o to, aby nowe odcinki rysowały się do środka kwadratu, a nie na zewnątrz.

Krzywa Peano-Gospera

Nazwisko Giuseppe Peano jest znane w matematyce z jego krzywej wypełniającej płaszczyznę. Ma ona dość bogatą literaturę i kilka ciekawych wariantów. Można ją doskonale modelować za pomocą L-systemów, ale wymaga ona dwóch reguł i to zaczyna być już nieco bardziej skomplikowane. W tym artykule opowiemy o innej krzywej, zwanej krzywą Peano-Gospera.

Popatrzmy, jak ona wygląda w kodzie i potem na rysunku. Tym razem mamy kolejno: dwa odcinki A i B, kąt 60 stopni, figurą początkową jest odcinek A. Jak pamiętamy, podobnie było w przypadku smoka Hartera-Heighwaya. Tam też mieliśmy dwa odcinki – dla rozróżnienia zaznaczyliśmy je różnymi kolorami. Teraz reguły. Mamy osobne reguły dla każdego z odcinków:

  • Reguła dla odcinka A: A=A−B−−B+A++AA+B−,
  • Reguła dla odcinka B: B=+A−BB−−B−A++A+B.

Pierwsza iteracja daje nam mało interesujący obiekt. Natomiast dalsze są już znacznie ciekawsze. Oto kilka z nich.
 

 

Kolejne iteracje krzywej Peano-Gospera 
Mamy tu kolejno: pojedynczy krok iteracji, drugą iterację, trzecią, czwartą i piątą. Obiekt końcowy, czyli figura otrzymana po nieskończonej liczbie kroków iteracji, będzie krzywą pokrywającą płaszczyznę.

Więcej na temat krzywych wypełniających płaszczyznę znajdziemy w różnych źródłach internetowych lub w pracach naukowych. Pisze o nich również Mandelbrot2 w rozdziale 7.

Modelowanie wzrostu roślin

Aristid Lindenmayer zasłynął ze swoich badań struktur organicznych. Jego bliskim współpracownikiem był polski informatyk, Przemysław Prusinkiewicz, obecnie profesor na uniwersytecie w Calgary w Kanadzie. Jego zespół kontynuuje badania Lindenmayera po jego śmierci w 1989 roku. Dość obszerna monografia1 przedstawia najważniejsze wyniki w tym zakresie, otrzymane jeszcze wspólnie z Lindenmayerem.

Koncepcja modelowania roślin z zastosowaniem L-systemów polega na zauważeniu, że kąty, pod jakimi wyrastają poszczególne elementy rośliny, są zawsze do siebie zbliżone dla danego gatunku. Podobnie jest z proporcją długości nowych pędów w stosunku do starych. Jeśli te oraz parę innych specyficznych własności roślin zaczniemy zapisywać w postaci reguł L-systemów, to będziemy otrzymywać schematyczne wizerunki roślin. Teraz wystarczy napisać odpowiednie oprogramowanie, które – korzystając z otrzymanych wyników – będzie tworzyło realistyczne obrazy i otrzymamy to, na czym opiera się duża część współczesnych filmów graficznych.
 

Dwa drzewa powstałe z iteracji odcinka 
W każdym przypadku odcinek jest przesuwany i obracany o zadany kąt. Przy czym każda kopia odcinka może być obracana o inny kąt. To pozwala na stworzenie dość złożonych obrazów.

Iteracje trójkątów, kwadratów i innych stworów

O ile różne implementacje klasycznych L-systemów nie pozwalają używać innych elementów do tworzenia iteracji niż zwykły odcinek (np. MuPAD, Mathematica), o tyle programy do geometrii mają znacznie mniej ograniczeń w tym zakresie. Podobnie jest z rysowaniem i malowaniem ręcznie. Tu możemy używać praktycznie wszystkiego, co nam przyjdzie do głowy, jeśli tylko mamy wystarczająco dużo czasu i cierpliwości. Zasada jest tu tylko jedna – kolejne obiekty muszą być skonstruowane w zależności od obiektów początkowych zgodnie z założonymi regułami. Natomiast to, jak skomplikowany jest ten twór, ma znaczenie tylko w przypadku iteracji, gdzie pojawia się gigantyczna liczba elementów. W takim przypadku obserwujemy charakterystyczne zwolnienie programu (podczas manipulacji obiektem końcowym) lub nasze (jeśli rysujemy L-system ręcznie).

Trójkąty w akcji

Trójkąt Sierpińskiego jest niewątpliwie jednym z najbardziej znanych tworów w matematyce. Wprawdzie Wacław Sierpiński opisał ten twór w roku 1915, ale jest to obiekt znany od czasów dawnych. Znajdziemy jego różne wersje w kościołach rzymskich. Są to najczęściej obiekty do trzeciej iteracji włącznie. Składają się one z równobocznych trójkątów wyciętych z marmuru lub innego kamienia. Popatrzmy na konstrukcję trójkąta Sierpińskiego z różnych punktów widzenia. Najprościej jest go utworzyć przez dzielenie boków trójkąta równobocznego.

Klasyczny trójkąt Sierpińskiego
 


 

 

Trójkąt Sierpińskiego – kilka różnych etapów iteracji
Na załączonych tu rycinach mamy pokazane, w jaki sposób tworzymy trójkąt Sierpińskiego, i kilka etapów jego iteracji. Sama konstrukcja jest dość prosta – bierzemy trójkąt równoboczny, znajdujemy środki jego boków i łączymy je odcinkami. Powstają w ten sposób cztery trójkąty – trzy zewnętrzne i jeden w środku. Zamalowujemy trójkąt środkowy jakimś kolorem i powtarzamy podział boków dla zewnętrznych trójkątów. W ten sposób powstaje pokazana na rysunkach seria obraz...

Pozostałe 70% treści dostępne jest tylko dla Prenumeratorów.

Co zyskasz, kupując prenumeratę?
  • 6 wydań czasopisma "Matematyka"
  • Dostęp do wszystkich archiwalnych artykułów w wersji online
  • Możliwość pobrania materiałów dodatkowych, testów i zadań
  • ...i wiele więcej!
Sprawdź

Przypisy