Strona główna » Algorytmy » Artykuły » Płatek Śniegu
 

Płatek Śniegu

Wstęp

Płatki śniegu posiadają bardzo ciekawą i symetryczną budowę. Każdy kto choć raz przyjrzał się płatkowi z pewnością wie, że ich budowa wydaje się całkiem skomplikowana jak na zwykły biały okruszek lecący z nieba. W tym artykule zostanie przedstawione jak krok po kroku zacząć rysować coraz bardziej skomplikowane płatki śniegu.

Implementacja

Po prostu płatek

Płatek śniegu ma sześć ramion od której odchodzą krótsze odnogi. Ze względu na swoją budowę posiada 3 osie symetrii. Oto przykładowy płatek śniegu:

Płatek Śniegu

Jak można zauważyć płatek składa się z sześciu identycznych części. Na każdym z ramion zostały dorysowane identyczne odgałęzienia po obu stronach o różnej wielkości.

  1. def ramie(a):
  2.   żółw.lt(60)
  3.   żółw.fd(a)
  4.   żółw.back(a)
  5.   żółw.rt(120)
  6.   żółw.fd(a)
  7.   żółw.back(a)
  8.   żółw.lt(60)

Przedstawione funkcja płatek rysuje sześć identycznych części i każda z nich polega na podzieleniu odcinka na trzy części narysowaniu odnóg poprzez wywołaniu funkcji ramie(), a następnie powrotu do punktu z którego się zaczęło. Funkcja ramie() rysuje taki sam odcinek o długości a po lewej i prawej stronie.

  1. def płatek(r):
  2.   for i in range(6):
  3.     żółw.fd(r / 3)
  4.     ramie(r / 6)
  5.     żółw.fd(r / 3)
  6.     ramie(r / 3)
  7.     żółw.fd(r / 3)
  8.     żółw.back(r)
  9.     żółw.rt(60)

Płatek jest rysowany po wywołaniu przykładowo:

  1. płatek(100)

Zmyślony płatek

Chociaż płatki zawsze mają sześciokątny kształt to czemu nie narysować np. pięciokątnego? Funkcja będzie teraz przyjmować liczbę n - ile gałęzi narysować oraz odl - listę, która będzie określać jak duże mają być ramiona. Będą to liczby z przedziału [0, 1] i będą mnożone przez aktualną długość gałęzi r. Zakładamy, że kolejność pomiędzy kolejnymi ramionami jest taka sama.

Zmyślony Płatek Śniegu

Płatek nie przypomina niczego co można było dostrzec podczas długich, zimowych wieczorów! Jednak, aby taki efekt osiągnąć należy zmodyfikować dotychczasową funkcję płatek(). Będzie teraz przyjmować nie jeden, a trzy argumenty.

  1. def płatek(n, r, odl):
  2.   k = len(odl) + 1
  3.   for i in range(n):
  4.     for a in odl:
  5.       żółw.fd(r / k)
  6.       ramie(a * r)
  7.     żółw.fd(r / k)
  8.     żółw.back(r)
  9.     żółw.rt(360 / n)

Na początku program oblicza na ile odcinków jest dzielone ramię, a następnie dla każdej gałęzi i każdego ramiona rysuje je, dorysowywuje koniec gałęzi, a następnie wraca do środka płatka śniegu i obraca się, aby narysować kolejną gałąź.

Płatek jest rysowany po wywołaniu przykładowo:

  1. płatek(5, 100, [1/7, 1/6, 1/5, 1/4, 1/3])

Fraktalowy płatek

Dotychczasowe płatki wydają się proste w budowie. Przydałoby się je teraz skomplikować przykładowo do takiej postaci:

Fraktalowy Płatek

Jak można zauważyć każde ramię jest jakby nową gałązką od której odchodzą kolejne ramiona. Na tej samej zasadzie są budowane fraktale, ale one tak naprawdę rysuję nieskończenie, więc trzeba ograniczyć ilość podpod...gałązek pewną wartością. Do funkcji będzie przekazywana w postaci argumentu st. W każdym kolejnym wywołaniu wartość będzie malała o 1, a kiedy osiągnie 0 zostanie narysowana jedynie prosta kreska. Nowa wersja funkcji ramie() wygląda następująco:

  1. def ramie(st, r, odl):
  2.   if(st == 0):
  3.     żółw.fd(r)
  4.   else:
  5.     k = len(odl) + 1
  6.     for a in odl:
  7.       żółw.fd(r / k)
  8.       żółw.lt(60)
  9.       ramie(st - 1, r * a, odl)
  10.       żółw.rt(120)
  11.       ramie(st - 1, r * a, odl)
  12.       żółw.lt(60)
  13.     żółw.fd(r / k)
  14.   żółw.back(r)

W powyższym kodzie została zawarta z funkcji płatek() pętla , która rysowała kolejne ramiona gałązki. Z tego powodu nie jest już potrzebna w niej i kod upraszcza się do:

  1. def płatek(n, st, r, odl):
  2.   for i in range(6):
  3.     ramie(st, r, odl)
  4.     żółw.rt(60)

Tym razem narysowanie płatka jest identyczne jak poprzednio:

  1. płatek(6, 2, 100, [1 / 4, 1 / 3])

Podsumowanie

Pomysłów na rysowanie płatków śniegu jest mnóstwo, a każdy z nich pozwola utworzyć unikatowe dzieło sztuki! Gorąco polecam spróbować napisać samemu funkcję, która będzie rysować płatek śniegu według pewnego schematu.