Strona główna » Poradniki » Logomocja » Galeria » Drzewo

Drzewo

Wstęp

W artykule przedstawie sposób rysowania drzewa w sposób rekurencyjny oraz przy wykorzystaniu liczb pseudolosowych. W ten sposób powstają rysunki do złudzenia przypominające te z życia codziennego. Oczywiście kod ten można usprawnić na wiele różnych sposobów co może podnieść poziom realizmu.

Implementacja

W celu lepszego wyjaśnienia kodu poniżej zostały zamieszczone trzy różne procedury rysujące. Każda następna wzoruje się na poprzedniej i stara się udoskonalić rysunek drzewa.

Proste drzewo

Etap I - drzewo proste

Narysowane drzewo będzie składać się z prostych gałęzi z który każdy poziom nachylony jest do poprzedniego pod kątem 45°. Takie drzewo nie wygląda zbyt imponująco, ale jest świetnym punktem wyjścia do napisania bardziej złożonej procedury. W przyrodzie na rozwój drzewa wpływa bardzo dużo czynników, których my niekoniecznie chcemy wprowadzać, aby otrzymać drzewo. Jednak, aby uzyskać bardziej naturalne drzwo możemy wkorzystać funkcję losującą.

  1. oto proste_drzewo :a :n
  2.   np :a
  3.   jeśli (:n > 1) [
  4.     lw 45
  5.     drzewo :a/2*3 :n-1
  6.     pw 90
  7.     drzewo :a/2*3 :n-1
  8.     lw 45
  9.   ]
  10.   ws :a
  11. już
Prawie drzewo

Etap II - bardziej realistyczne drzewo

Zakładamy, że każdą gałąź względem poprzedniej może być odchylona w prawo lub lewo maksymalnie o 60°. Obydwie zmienne zapamiętujemy, żeby wiedzieć o ile powrócić żółwią, aby mógł rysować dalej. Dzięki tej zmianie drzewo nie ma już gałęzi prostopadłch do siebie.

  1. oto prawie_drzewo :a :n
  2.   niech "l losowa 60
  3.   niech "l2 losowa 60
  4.   jeśli (:n > 1) [
  5.     lw :l
  6.     drzewo :a/2*3 :n-1
  7.     pw :l+:l2
  8.     drzewo :a/2*3 :n-1
  9.     lw :l2
  10.   ]
  11. już
Losowe drzewo

Etap III - losowe drzewo

Kolejny zabieg kosmetyczny, który pozwoli wyglądać drzewu naturalniej jest długość gałęzi. W tym celu należy dodać losowość w linijkach 8 i 10. W dalszym kodzie zostało ustalone, aby długość następnego poziomu gałęzi wahał się pomiędzi 60%, a 80% długości poprzedniego poziomu.

Jeszcze jednym ciekawym pomysłem jest ustalenie grubości pisaka. Jak wiadomo drzewo "rośnie warstwami" (o czym świadczą słoje). Zakładając, że każdy poziom gałąź to kolejny etap rośnięcia drzewo to możemy przyjąć, że grubość gałęzi jest proporcjonalna do poziomu gałęzi. Ostatecznie ze wszystkimi poprawkami kod przedstawia się następująco:

  1. oto drzewo :a :n
  2.   ugp :n
  3.   np :a
  4.   niech "l losowa 60
  5.   niech "l2 losowa 60
  6.   jeśli (:n > 1)[
  7.       lw :l
  8.       drzewo :a/10*(6 + ((losowa 20) / 10)) :n-1
  9.       pw :l + :l2
  10.       drzewo :a/10*(6 + ((losowa 20) / 10)) :n-1
  11.       lw :l2
  12.   ]
  13.   ws :a
  14. już

Uwagi

Procedura przyjmuje tylko dwa parametry, ale można dodać ich znacznie więcej tj. ustalanie zakresu odchyłu gałęzi, zakres długości kolejnych gałęzi czy chociażby ilość gałęzi wychodzących z pojedynczego rozgałęzienia.