Strona główna » Algorytmy » Artykuły » Zbiór Cantora
 

Zbiór Cantora

Wstęp

Na podstawie zbioru Cantora można narysować bardzo ciekawy fraktal. W tym artykule zostanie wyjaśnione co to jest zbiór Cantora oraz jak na tej podstawie narysować fraktal.

Definicja

Zbiór Cantora to odcinek [0, 1] z którego wycina się środką 1/3 części, a następnie wykonuje się to samo dla dwóch powstałych. W ten sposób w każdym kolejnym kroku liczba odcinków zwiększa się dwukrotnie, a zamalowana część odcinka maleje. Początkowo wynosi ona 1, potem 2/3, 4/9, 8/27 itd.

Najlepiej jest to zobrazować na rysunku. Poniżej zostały przedstawione cztery kolejne kroki wyznaczania zbioru Cantora:

Fraktal

Jak można zauważyć kolejne kroki wyznaczenia zbioru Cantora narysowane jedno pod drugim tworzą fraktal, ponieważ po zbliżeniu na którąkolwiek odnogę możemy dostrzec ten sam wzór.

Implementacja

Zbiór n-tego rzędu

Fraktal jest tworem rekurencyjnym i choć można go rysować w nieskończoność to przyjmuje się jakiś warunek stopu, ponieważ dalsze zmiany nie będą widoczne na obrazku. W tym przypadku zostanie przyjęte, że rysujemy zbiór Cantora n-tego rzędu. Przyjmujemy, że jeśli n > 0 to rysujemy kreskę z której wycinamy środek, a dla n = 0 rysujemy całą kreskę o zadanej długości.

Przykładowa implementacja metody ZbiorCantor() przyjmuje następujące argumenty: dl - szerokość rysunku, wytnij - część rysunku do wycięcia oraz n - ile poziomów narysować.

  1. def ZbiorCantor(dl, wytnij, n):
  2.   if(n == 0):
  3.     żółw.pd()
  4.     żółw.forward(dl)
  5.     żółw.pu()
  6.   else:
  7.     nowa_dl = dl*(1 - wytnij)/2
  8.     ZbiorCantor(nowa_dl, wytnij, n - 1)
  9.     żółw.forward(dl*wytnij)
  10.     ZbiorCantor(nowa_dl, wytnij, n - 1)

Jeśli n = 0 to wystarczy narysować kreskę o zadanej długości dla pozostałych przypadków obliczamy nową długość dla nie wyciętych części, a następnie rysujemy lewy, pomijamy wycięty środek i rysujemy prawą stronę.

Warto zauważyć, że kreska jest faktycznie rysowana tylko dla n = 0. Napisana funkcja w tej chwili rysuje jedynie kreskę o wybranej złożoności o czym można się przekonać wywołując:

  1. szerokosc = 400
  2. żółw.pu()
  3. żółw.back(szerokosc/2)
  4. ZbiorCantor(szerokosc, 1/3, 1)

Fraktal

Jednak, aby narysować pełny fraktal wykorzystując napisaną funkcję wystarczy odpowiednio ustawiać żółwia, a następnie wywołać metodę z odpowiednimi parametrami. Poniższy przykład środek fraktalu umieszcza pośrodku strony i rysuje n rzędów.

  1. szerokosc = 400
  2. wysokosc = 300
  3. n = 4
  4. żółw.pu()
  5. żółw.back(szerokosc/2)
  6. żółw.lt(90)
  7. żółw.forward(wysokosc/2)
  8. for i in range(n):
  9.   żółw.rt(90)
  10.   ZbiorCantor(szerokosc, 1/3, i)
  11.   żółw.back(szerokosc)
  12.   żółw.lt(90)
  13.   żółw.back(wysokosc / (n - 1))
Fraktal

Uwaga: Warto pamiętać, że rysowanie dla dużych n może nie mieć sensu, ponieważ długości kresek w pewnym momencie będą mniejsze niż jeden piksel, a więc staną się niewidoczne.