Wielokrotnie - między innymi miesiąc temu - zajmowaliśmy się programami generującymi obrazy za pomocą różnych formuł matematycznych. Uzyskiwaliśmy piękne, ale statyczne obrazy. Dzisiaj nadamy im dynamikę - z wirtualną kamerą zanurzymy się w matematycznym przestworze.
Wielokrotnie - między innymi miesiąc temu - zajmowaliśmy się programami generującymi obrazy za pomocą różnych formuł matematycznych. Uzyskiwaliśmy piękne, ale statyczne obrazy. Dzisiaj nadamy im dynamikę - z wirtualną kamerą zanurzymy się w matematycznym przestworze.

Rysunek 1. W ubiegłym miesiącu wykreślaliśmy niepokojąco piękne obrazy, zwane zbiorami Julii. Każdy punkt obrazu najpierw był przeliczany (przeskalowany) w pewien wycinek przestrzeni matematycznej i poddawany długiej transformacji za pomocą szczególnie prostej funkcji. Kolor punktu zależał od tego, jak funkcjonowała jego trajektoria.Dzisiaj czeka nas dużo pracy. Miesiąc temu zajmowaliśmy się wykreślaniem pięknych obrazów, teraz sporządzimy ich tysiące i na koniec wszystkie skleimy w film.
Skoncentrujemy się na grafice zwanej zbiorem Julii (rysunek 1), choć uzyskane metody pozwolą na filmowanie całej klasy zagadnień. Julia jest nieskończenie piękna, a przy tym wykreślana w bardzo prosty sposób. Bez wdawania się w liczne, ale raczej łatwe szczegóły - których wyjaśnienie znajdą Państwo w materiałach z ubiegłego miesiąca i które za chwilę pokrótce przypomnimy - zaczniemy od naszkicowania głównego algorytmu:
for( i = 0; i < 1000; ++i)
{
// ustaw_parametry_zbioru_Julii
// wykreśl_zbiór_Julii
// zapisz_grafikę_w_pliku
}
Ten schemat jest jasny: w pętli, której rozpiętość równa się liczbie klatek naszego filmu, ustalamy parametry grafiki, wykreślamy obraz i zapisujemy go w pliku dyskowym. Efektem pracy tak napisanego programu będzie tysiąc graficznych plików dyskowych, zawierających ujęcia zbioru Julii (rysunek 2).
Błądzące piksele
Jeszcze pamiętamy z poprzedniego Prog&Play, że dywanem na nieograniczonej powierzchni nazywamy obraz - ślad, który w przestrzeni matematycznej pozostawia punkt poddawany bardzo długiemu przekształcaniu jego współrzędnych. Wykreślać możemy zarówno całe trajektorie błądzących punktów, jak i pewne ich fragmenty - w skrajnym wypadku tylko ostatnie punkty. Receptur błądzenia, także kolorowania punktów, jest nieskończenie wiele, ale kilka z nich zasługuje na specjalną uwagę.

Rysunek 2. Ten program będzie pracował godzinami... Na każdym etapie pracy algorytmu zostanie wykreślony i zapisany w pliku dyskowym kompletny zbiór Julii. Potem wszystkie te pliki połączymy w film.Zostawmy na razie Julię i przyjrzyjmy się kilku problemom technicznym związanym z filmowaniem. Każdy obraz zbioru Julii wykreślimy nie tak jak dotychczas - bezpośrednio na graficznej powierzchni okna - na komponencie Image (obraz). Dlaczego? Dlatego, że komponent ten ma niezwykle użyteczną funkcję SaveToFile() - zapisz obraz w pliku dyskowym. Tym samym odpada pierwszy poważny problem - zagadnienie zapisu obrazu w jakimś uznanym formacie graficznym. Funkcja SaveToFile() wymaga podania jednego, oczywistego parametru - nazwy pliku, w którym ma być zapisana grafika. Skoro tak, to od razu zadbajmy, aby nazwy te układały się w czytelny ciąg, możliwy do automatycznego zebrania wszystkich klatek w film. Niech będą najprostsze - tożsame z kolejnymi numerami klatek filmu:
0.bmp
1.bmp
2.bmp
...
999.bmp
Oto nasz szkic algorytmu, uzupełniony o fragment zapisywania klatki filmu pod nazwą tożsamą z jej numerem:
AnsiString nazwa;
for( i = 0; i < 1000; ++i)
{
// ustaw_parametry_zbioru_Julii
// wykreśl_zbiór_Julii_na_komponencie_ // Image
nazwa = String( i) + ".bmp"
Image1 -> SaveToFile( nazwa);
}