wtorek, 24 sierpnia 2010

Płonący statek

Dzisiaj koniec serii nt. różnych fraktali. Skończymy w płomieniach.

Ponad 2 lata temu na kursie asemblera na PWr mieliśmy za zadanie napisać program w dowolnym języku wysokiego poziomu wykorzystując przy tym zarówno wstawki asemblerowe jak i wywołania procedur napisanych w czystym asemblerze, dołączanych jako pliki .OBJ. Dodatkowo w ramach ćwiczenia trzeba było wykorzystać koprocesor numeryczny. Mój wybór na Pascala z racji młodzieńczych sentymentów. A czy jest coś fajniejszego i prostszego do napisania na koprocesor niż fraktale i tryb 13h? Raczej nie ;)

W początkowej wersji program obsługiwał tylko zbiory Julii, wczoraj i dzisiaj dopisałem zbiór Mandelbrota oraz bardzo ciekawy fraktal, "Płonący statek".


Płonący statek jest niezwykle prostą modyfikacją zbioru Mandelbrota. Fraktal ten to zbiór takich liczb zespolonych c, że ciąg zn definiowany jako
 z0 = 0
 zn+1 = (|Re(zn)| + i * |Im(zn)|)2 + c
nie dąży do nieskończoności przy n -> ∞.

Jak widać jedyną różnicą między płonącym statkiem o zbiorem Mandelbrota jest wartość bezwzględna z części rzeczywistej i części urojonej zn. Jedna taka mała modyfikacja (cztery dodatkowe linijki kodu) znacząco zmienia wygląd fraktala.

Dodany tutaj programik działa dość sprawnie - oczywiście nie na sprzęcie z epoki 386, aż tak dobrze nie ma ;) Wykorzystałem tryb 13h udostępniany przez karty VGA. Dzięki temu wyświetlanie grafiki było proste i przyjemne, wadą jest oczywiście niska rozdzielczość (320x200), prostokątne piksele, tylko 256 kolorów (i tak wykorzystuję tylko szarości) i brak możliwości zrobienia print screena ;) Teraz chyba już nikt nie rysuje po ekranie odwołując się bezpośrednio do pamięci karty graficznej ;)

Klawiszologia:
W/S/A/D - przesuwanie fraktala
Q/E - pomniejszenie/powiększenie
+/- - zwiększenie/zmniejszenie dokładności obliczeń
1/2/3 - wybór fraktala: zbiór Julii/Mandelbrota/Płonący statek
U/J/I/K - dla zbioru Julii modyfikacja parametru c
Z - wyjście


Program do pobrania:
http://wojtekm.ovh.org/fractals.exe
Kody źródłowe:
http://pastebin.com/kumyrRum - cały program.
http://pastebin.com/RrJb6cP2 - procedury do obsługi trybu 13h.

Więcej o samych fraktalach:
http://en.wikipedia.org/wiki/Julia_set
http://en.wikipedia.org/wiki/Mandelbrot_set
http://en.wikipedia.org/wiki/Burning_Ship_fractal

I trybie 13h: http://en.wikipedia.org/wiki/Mode_13h

6 komentarzy:

  1. No patrz, a ja nawet nie pamiętam, czy robiłem program ze wstawkami assemblerowymi (to było obowiązkowe zadanie?), a jak tak, to nawet nie pamiętam co zrobiłem :D

    OdpowiedzUsuń
  2. Zadanie było na bank obowiązkowe ;) Ale chyba można było wybrać coś podstawowego albo "na wyższą ocenę" chociaż może pamięć już mnie zawodzi - w końcu nie jesteśmy młodzi ;)

    OdpowiedzUsuń
  3. „Please contact the software vendor to ask if a 64-bit Windows compatible version is available”. No to się kontakt-wendorzę. :)

    OdpowiedzUsuń
  4. Oj pamiętam jak dawno dawno temu rzeźbiłem w 13h :)

    OdpowiedzUsuń
  5. @Arczi: no niestety, rozwiązanie problemu to wirtualizacja XP i uruchomienie programu tam ;)

    OdpowiedzUsuń
  6. http://www.wykop.pl/ramka/455237/10-minutowe-zblizenie-fraktala-w-hd-155mb-renderowal-sie-6-miesiecy/

    OdpowiedzUsuń