Fraktale - Python

Podstawy języka Python

Fraktale to obiekty powstające na skutek powtarzania tego samego elementu wiele razy w różnym powiększeniu.

Rysowanie fraktali można zaprogramować w Pythonie.
Tworzenie grafiki wymaga zainstalowania środowiska, którego najnowsza wersja znajduje się pod adresem:
https://www.python.org/downloads/

rysowanie w Pythonie

Grafika możliwa jest poprzez wydawanie poleceń obiektowi (tzw. żółw), który znajduje się na ekranie.
Może się on poruszać o określoną ilość punktów i obracać o podany kąt w prawo lub lewo.

W Pythonie za grafikę odpowiada moduł turtle i należy go zaimoprtować za pomocą polecenia:
from turtle import*

W poniższej tabeli zestawiłem podstawowe polecenia, które można wydawać:

Polecenie Opis działania
fd(n) Przesunięcie obiektu o n kroków do przodu
bk(n) Przesunięcie obiektu o n kroków do tyłu
rt(alfa) Obrót obiektu o alfa stopni w prawo
lt(alfa) Obrót obiektu o alfa stopni w lewo
pu() Podniesienie pisaka - przemieszczanie obiektu bez rysowania
pd() Opuszczenie pisaka - rysowanie podczas przemieszczania

Obiekt domyślnie znajduje się na środku ekranu i jest skierowany w prawą stronę z opuszczonym pisakiem.

Przykładowa procedura rysująca kwadrat wygląda następująco: fraktale w Python W wyniku uruchomienia otrzymujemy: fraktale w Python

gwiazda

Pierwszym zadaniem jest narysowanie gwiazdy przedstawionej na rysunku: fraktale w Python

Należy "wyszukać" element, który się powtarza.
Popatrzmy na rysunek: fraktale w Python Widać tu, że powtarzany jest zaznaczony na czerwono element.

Napiszmy procedurę fragment, która narysuje wskazany element: fraktale w Python w efekcie otrzymujemy: fraktale w Python

Jeśli powtórzymy rysowanie 4 razy (strzałka skierowana jest w prawo, zatem po narysowaniu fragmentu należy obrócić obiekt o 90 stopni w lewo) otrzymamy naszą gwiazdę, zatem: fraktale w Python rysuje całą gwiazdę.

krzywa Kocha - to już fraktal

Krzywa Kocha stopnia 0 ma postać odcinaka o długości a

Aby utworzyć krzywą stopnia 1 należy podzielić odcinek na trzy części. Środkowa część zyskuje kształt "ząbka" będącego bokami trójkąta równobocznego, podobnie jak przy rysowaniu fragmentu gwiazdki. fraktale w Python

W zależności od stopnia uzyskujemy następujące efekty (podstawowa dłuość boku wynosi 400):

stopień 0 fraktale w Python procedura: fraktale w Python

stopień 1 fraktale w Python procedura: fraktale w Python

stopień 2 fraktale w Python procedura: fraktale w Python

stopień 3 fraktale w Python procedura: fraktale w Python

stopień 4 fraktale w Python procedura: fraktale w Python

Jak to zrobić?

Jak widać utworzenie rysunku wyższego stopnia wymaga wywołania procedury poprzedniej dla krótszej długości boku.
Takie tworzenie procedur prowadzi nas prosto do tzw. rekurencji, czyli procedura wywołuje samą siebie dla zmniejszonych wartości parametru.

Warunkiem koniecznym jest zdefiniowanie instrukcji warunkowej kończącej działanie procedury.

Procedura rekurencyjna rysująca krzywą Kocha stopnia n: fraktale w Python

płatek Kocha

Rysunki przedstawiają wersje dla stopnia 0,1,2,3.

Jak to wykonać?
Krzywa Kocha... 120° i gotowe.

fraktale w Python fraktale w Python fraktale w Python fraktale w Python

...i wynik...

drzewo binarne

Idea drzewa binarnego polega na tym, że z każdej gałązki "wyrastają" dwie pod różnymi kątami.
Dla drzewa stopnia 0 nie ma gałązek - rysowany jest tylko "pień" drzewa, czyli pionowa kreska. fraktale w Python

Jeśli założymy, że drzewo jest symetryczne lewa gałązka może wyrastać po kątem 30°, prawa również.
Zatem kąt pomiędzy nimi wynosi 60°.
Drzewo stopnia 1 wygląda następująco: fraktale w Python

Najbardziej właściwym sposobem jest użycie procedury rekurencyjnej.
Dla stopnia 0 rysuje odcinek do przodu i wstecz.

Dla stopnia pierwszego:

  • rysujemy "pień" drzewa
  • obracamy żółwia o 30° w lewo
  • wywołujemy ponownie procedurę drzewo dla stopnia n-1 i krótszych gałązek (rysowana jest krótsza gałązka)
  • obracamy żółwia o 60° w prawo
  • wywołujemy ponownie procedurę drzewo dla stopnia n-1 i krótszych gałązek (rysowana jest krótsza gałązka)
  • obracamy żółwia o 30° w lewo
  • rysujemy "pień" drzewa wstecz

Możemy zatem zdefiniować procedurę, która narysuje drzewo dowolnego stopnia: fraktale w Python

Praktyczne rozwiązanie wygląda następująco:

trójkąt Sierpińskiego

Trójkąt Sierpińskiego otrzymuje się następująco:

  • w trójkącie równobocznym łączy się środki boków, dzieląc go na cztery trójkąty,
  • trójkąt środkowy pozostaje bez zmian,
  • wobec trzech pozostałych operację się powtarza.

Dla procedury rekurencyjnej możemy wykonać następujące kroki:

  • procedurę nazywamy trojkat_sierpinskiego(bok, n)
  • dla n=0 rysujemy trójkąt równoboczny.
Dla stopnia wyższego:
  • rysujemy trójkąt o 2 razy krótszych bokach,
  • przenosimy żółwia w prawo o połowę boku,
  • rysujemy trójkąt o 2 razy krótszych bokach,
  • wracamy do punktu początkowego,
  • przenosimy żółwia do wierzchołka pierwszego trójkąta,
  • rysujemy trójkąt o 2 razy krótszych bokach,
  • wracamy do punktu początkowego.

Wywołując procedurę dla różnego n otrzymujemy:

  • stopień 0: fraktale w Python
  • stopień 1: fraktale w Python
  • stopień 2: fraktale w Python
  • stopień 3: fraktale w Python
  • stopień 4: fraktale w Python
  • stopień 5: fraktale w Python
  • stopień 6: fraktale w Python

Procedura: fraktale w Python

Praktyczne rozwiązanie wygląda następująco:

Projekt i wykonanie: Ryszard Rogacz© 1999−2024