apewne zauwa┐y│e╢, jak popularne s▒ ostatnio zabawki typu elektroniczne ┐yj▒tka - rybki "┐yj▒ce" na ekranie, wirtualne "pieski", kt≤re trzeba "karmiµ" i "wyprowadzaµ", oraz Tamagochi, kt≤rym robi siΩ nawet "cmentarze". Przy ca│ej g│upkowato╢ci tego typu atrakcji mo┐emy jednak pokusiµ siΩ sami o stworzenie w│asnej wersji czego╢, co trzeba bΩdzie regularnie pielΩgnowaµ itd. Nie bΩdzie to jednak zwierzΩ, ale wirtualne drzewko, kt≤re bΩdzie rosn▒µ na ekranie. Chodzi oczywi╢cie o pracΩ nad odpowiednim algorytmem, wg kt≤rego to drzewko bΩdzie rysowane. Algorytm ten zosta│ kiedy╢ opisany w "Bajtku", ja go tylko odm│odzΩ:)
Nasze drzewko bΩdzie sk│ada│o siΩ z bardzo prostych element≤w - bΩd▒ to po prostu linie imituj▒ce jego ga│Ωzie. Na pocz▒tek napiszemy bardzo prost▒ wersjΩ algorytmu, kt≤ra bΩdzie rysowaµ tylko drzewka o regularnych kszta│tach. Pomys│ na narysowanie drzewka opiera siΩ na jednej, rekurencyjnej procedurze, kt≤ra bΩdzie rysowaµ "swoj▒" ga│▒zkΩ i wywo│ywaµ siΩ dwukrotnie tworz▒c dla siebie "pΩdy" pod nowe ga│▒zki. Procedura ta zawsze bΩdzie dostawaµ jako argumenty cztery liczby. Dwie pierwsze to wsp≤│rzΩdne punktu na ekranie bΩd▒ce wsp≤│rzΩdnymi punktu do wypuszczenia nowych ga│▒zek. Trzecia liczba to poziom ga│Ωzi. Warto╢µ ta bΩdzie zmniejszana o 1 w ka┐dym poziomie rekurencji i dziΩki temu mo┐na tak kontrolowaµ wywo│ania rekurencyjne, aby kiedy╢ siΩ sko±czy│y, a nie trwa│y w niesko±czono╢µ. Czwarty argument to k▒t miΩdzy "ziemi▒" bΩd▒c▒ uk│adem odniesienia a nowogenerowan▒ ga│Ωzi▒. Argument ten jest odpowiednio zwiΩkszany lub zmniejszany w ka┐dym poziomie rekurencji z u┐yciem specjalnego skalowania (za pomoc▒ sta│ej). Oczywi╢cie ka┐de wywo│anie funkcji to tak┐e narysowanie odpowiedniej ga│▒zki.
Na pocz▒tku k▒t miΩdzy p│aszczyzn▒ nale┐y ustawiµ na pi, co wynika z tego, ┐e wsp≤│rzΩdne ekranu s▒ liczone z g≤ry na d≤│!!! Trzeba siΩ pomΩczyµ, gdy┐ intuicyjnie odczuwamy, ┐e ze wzrostem drzewa wsp≤│rzΩdna pionowa punkt≤w wypuszczania pΩd≤w powinna siΩ zwiΩkszaµ, a tymczasem musi byµ inaczej. Spr≤buj do╢wiadczalnie, jak zachowywa│oby siΩ drzewko, gdyby zmieniaµ pocz▒tkow▒ warto╢µ k▒ta:)
Wsp≤│rzΩdne punkt≤w pod nowe pΩdy wyliczane s▒ ze wzoru na wsp≤│rzΩdne punktu na okrΩgu przy znanym promieniu i k▒cie jego obrotu. My╢lΩ, ┐e teraz poni┐szy program powinien byµ dla Ciebie zrozumia│y. Dodam jeszcze, ┐e sta│a "dl" to d│ugo╢µ ga│▒zek, "max" to maksymalny poziom rekurencji, a "skala" to dobierana do╢wiadczalnie warto╢µ steruj▒ca odchyleniem ga│▒zki od "ziemi".
uses graph; const max=7; dl=20; skala=10.47; var vga,vgahi: integer; procedure drzewo(x,y: integer; poziom: integer; kier: real); var xnew,ynew: integer; begin poziom:=poziom-1; xnew:=x+round(dl*sin(kier)); ynew:=y+round(dl*cos(kier)); line(x,y,xnew,ynew); if poziom>0 then begin drzewo(xnew,ynew,poziom,kier-pi/skala); drzewo(xnew,ynew,poziom,kier+pi/skala); end; end; begin initgraph(vga,vgahi,'c:\prog\bp\bgi'); drzewo(320,450,max,pi); readln end.
W wyniku dzia│ania tego programu zostanie narysowane takie oto "drzewko":
ZdajΩ sobie jednak sprawΩ, ┐e to drzewko nie wygl▒da zbyt atrakcyjnie. Modyfikuj▒c tylko warto╢ci sta│ych nie zdzia│amy zbyt wiele. Ciekawe efekty mo┐na jednak osi▒gn▒µ stosuj▒c losowe rezygnacje z rysowania niekt≤rych ga│Ωzi oraz zmieniaj▒c d│ugo╢ci ga│Ωzi rysowanych w kolejnych etapach. Nie bΩdΩ tutaj wstawia│ przyk│adowych kod≤w, gdy┐ ich stworzenie nie powinno Tobie sprawiµ trudno╢ci.