Fraktály Benoita Mandelbrota
Jednou z matematických teórií, ktoré sú krásne nielen pre matematikov, je určite výpočet fraktálov – geometrických útvarov v komplexnej rovine, ktoré sa veľmi nápadne podobajú na prírodné útvary. Táto ich pozoruhodná vlastnosť, ktorú nikto nemohol objaviť pred vznikom dostatočne rýchlych počítačov, sa veľmi často využíva pri modelovaní pohorí a morských pobreží vo filmoch a fantastických obrazoch.
Jeden z dvojrozmerných fraktálnych útvarov nesie meno svojho objaviteľa, zamestnanca firmy IBM, Benoita Mandelbrota – Mandelbrotova množina (MM). Máte možnosť spoznať jej krásy prostredníctvom rovnomenného programu napísaného v rýchlom a rozšírenom GFA BASIC-u. Záujemcov o podrobný popis teórie odkazujem na časopisy Vesmír 8/88 a VTM 18/89 ai.
Základnú vstupnú charakteristiku každej MM tvoria súradnice okrajov na 'x'-ovej a 'y'-ovej osi, to znamená štyri reálne čísla 'a,b,c,d', ďalej dve prirodzené čísla: počet opakovaní 'e&' (musí byť tým väčší, čím menší výrez je zobrazovaný) a maximálna suma 's|' (číslo 4.0 vyhovuje pre všetky súradnice menšie ako základné). Os 'y' je na obrazovke orientovaná opačne ako sme zvyknutí, pretože tak je orientované aj počítadlo riadkov obrazovky – nula je vľavo hore.
Okrem toho program žiada zadať počet obrázkov, ktoré sa budú kresliť – v interpreteri GFA iba jeden, v skompilovanom programe najviac sedem, s pamäťovým rozšírením aj viac – maximálny počet možno nastaviť pomocou premennej 'maxi|' na začiatku programu. Kvôli komfortu je výhodné zadávať tiež aktuálny dátum a pomenovať obrázok, pretože pohľadov do MM je nekonečne veľa. Možno si tiež zvoliť, či bude kreslenie viditeľné – ak nie, procesor bude trochu odľahčený, čo sa prejaví kratším časom kreslenia pri zložitejších obrázkoch. Keď sú všetky parametre obrázku zadané, program sa uistí o ich správnosti, náhodne si zvolí kresliace farby a začne pracovať. Vďaka príkazu ON BREAK CONT, ktorý výpočet tiež urýchľuje, sa už potom program nenechá vyrušovať. Po skončení kreslenia sa na titulnej lište zobrazí využitý čas. Titulok možno meniť klávesou 'X', obrázok možno vytlačit – 'H', vytlačit parametre – 'P', spustiť znovu – 'R', skončiť – 'Q'. Po vykreslení viacerých obrázkov naraz si v nich možno listovať kurzormi <- a ->.
Za rýchlosť je zodpovedné jadro programu, kde prebieha cyklus výpočtu farby pre každý bod obrazovky. Vyskúšal som rôzne typy cyklov: 'while-wend', 'do-loop' – nakoniec sa mi najrýchlejší zdal 'repeat-until'. V prípade, že máte pamäťové rozšírenie, môžte si zväcšiť raster obrazovky i počet farieb, avšak výpočet bude oveľa dlhší. Program je potrebné skompilovať, pretože práve kompilácia má najväčší vplyv na rýchlosť.
Niekoľko parametrov pre prvé obrázky (a,b,c,d,e&,s|):
-2, 0.5, -1.5, 1.5, 50, 4 (základný obrázok)
-0.7716, -0.6336, 0.2761, 0.4141, 200, 4
-1.8, -1.74, -0.023, 0.023, 200, 4
0.00355, 0.0038, 0.6492, 0.64945, 200, 4
Ak sa niekomu podarí zrýchliť výpočet v tomto jazyku, rád ho spoznám. Záujemcom poskytnem nielen odpovede na prípadné otázky, ale i veľa súradníc pekných obrázkov, ktoré som našiel. Adresa v redakcii.
Kedže výpočet zložitejších obrázkov trvá niekoľko hodín, doporučujem nechávať pocítač pracovať cez noc. Amiga-umelkyňa sa Vám odmení krásnym darčekom v podobe série pestrofarebných ornamentov. Zostáva len na Vás, či v nich uvidíte malé kvietky, bradavice, dračie chvostíky, bodkované lienky, alebo niečo úplne iné...
Publikované v Amiga, měsíčník pro uživatele počítačů amiga č. 6, 1992, str. 18, 20-21, vyd. Jiří Prózr, Praha, ČSFR.
REM MANDELBROTOVA MNOZINA - Tomáš Fülöpp 1991
REM (c) Redakce casopisu Amiga 1992
REM 'Uvolnenie pamati'
~ CloseWorkBench()
REM 'Otvorenie obrazovky a okna'
OPENS 1,0,0,320,256,4,0
OPENW #1
FULLW #1
CLEARW #1
SETCOLOR 0,0,0,0
SETCOLOR 1,15,15,15
REM 'Nastavenie max.poctu obrazkov'
maxi|=7
REM 'Definovanie premennych'
DIM q$(maxi|)
DIM p$(maxi|)
DIM info$(maxi|)
DIM ob$(maxi|)
DIM oc$(maxi|)
DIM br(maxi|)
DIM er(maxi|)
DIM bi(maxi|)
DIM ei(maxi|)
DIM nr&(maxi|)
DIM ms|(maxi|)
DIM meno$(maxi|)
DIM ano$(maxi|)
DIM cislo$(maxi|)
TITLEW #1," Tomica Software '91 predstavuje: "
PRINT AT(3,4);" => FRAKTALY BENOITA MANDELBROTA <= "
PRINT AT(0,8);
REM 'Vstupne parametre kazdeho obrazku'
chyba:
INPUT " Pocet obrazkov: ",uloha&
IF uloha&<=0 OR uloha&>maxi|
PRINT AT(0,CRSLIN-1);SPC(37)
PRINT AT(0,CRSLIN-1);
GOTO chyba
ENDIF
INPUT " Dnesny datum: ",datum$
FOR task|=1 TO uloha&
sey:
FOR zan|=11 TO 29
PRINT AT(0,zan|);SPC(37)
NEXT zan|
PRINT AT(0,12);" Obrazok c.";task|;"."
INPUT " Nazov obrazku: ",meno$(task|)
INPUT " Kreslenie vidno/nevidno (v/n): ",ano$(task|)
PRINT
INPUT " Zaciatok realnej osi: ",br(task|)
INPUT " Koniec realnej osi: ",er(task|)
INPUT " Zaciatok imaginarnej osi:",bi(task|)
INPUT " Koniec imaginarnej osi: ",ei(task|)
yba:
INPUT " Pocet opakovani: ",ms
IF ms<0 OR ms>32767
PRINT AT(0,CRSLIN-1);SPC(37)
PRINT AT(0,CRSLIN-1);
GOTO yba
ENDIF
nr&(task|)=ms
ba:
INPUT " Maximalny sucet: ",ms
IF ms<0 OR ms>255
PRINT AT(0,CRSLIN-1);SPC(37)
PRINT AT(0,CRSLIN-1);
GOTO ba
ENDIF
ms|(task|)=ms
PRINT
INPUT " Parametre obrazku OK ? (a/n):",sey$
IF sey$="n" OR sey$="N"
GOTO sey
ENDIF
NEXT task|
REM 'Nahodne nastavenie 15 farieb'
FOR set=2 TO 15
SETCOLOR set,RANDOM(8170)
NEXT set
REM 'Cyklus vypoctu obrazkov'
FOR task|=1 TO uloha&
IF ano$(task|)="n" OR ano$(task|)="N"
DISPLAY OFF
ENDIF
CLEARW #1
cislo$(task|)=STR$(task|)+"("+STR$(uloha&)+")"
TITLEW #1,cislo$(task|)+" Nazov: "+meno$(task|)
a=br(task|)
b=er(task|)
c=bi(task|)
d=ei(task|)
e&=nr&(task|)
s|=ms|(task|)
f=(b-a)/303
g=(d-c)/243
v&=e&/15
ON BREAK CONT
zac=TIMER
REM 'Jadro programu'
FOR m|=0 TO 242
FOR n&=0 TO 302
o=a+n&*f
p=c+m|*g
k&=0
u=0
x=0
REPEAT
IF k&=e&
GOTO b
ENDIF
INC k&
y=u^2
z=x^2
x=2*u*x+p
u=y-z+o
UNTIL y+z>=s|
COLOR k&/v&+1
PLOT n&,m|
b:
NEXT n&
NEXT m|
kon=TIMER
ON BREAK
DISPLAY ON
REM 'Cas a titulky kazdeho obrazku'
tim=(kon-zac)/200
hod|=TRUNC(tim/3600)
min|=TRUNC(FRAC(tim/3600)*60)
sek|=INT(FRAC(FRAC(tim/3600)*60)*60)
info$(task|)=cislo$(task|)+" Cas:"+STR$(hod|)+"h "+STR$(min|)+"m "+STR$(sek|)+"s"
TITLEW #1,info$(task|)
q$(task|)=cislo$(task|)+" xu="+STR$(a)+" xo="+STR$(b)+" yu="+STR$(c)+" yo="+STR$(d)+" kx="+STR$(e&)+" s="+STR$(s|)+" Cas:"+STR$(hod|)+"h "+STR$(min|)+"m "+STR$(sek|)+"s"
p$(task|)="Fraktaly Benoita Mandelbrota - Tomica Software "+datum$
GET 0,0,150,242,ob$(task|)
GET 151,0,302,242,oc$(task|)
DELAY 1
NEXT task|
DEC task|
REM 'Dalsie operacie s obrazkami'
DO
key$=INKEY$
IF key$="h" OR key$="H"
LPRINT SPC(1)
IF ano$(task|)="n" OR ano$(task|)="N"
LPRINT meno$(task|)+" - Kreslenie neviditelne"
ELSE
LPRINT meno$(task|)+" - Kreslenie viditelne"
ENDIF
LPRINT q$(task|)
LPRINT p$(task|)
HARDCOPY
ELSE IF key$="p" OR key$="P"
LPRINT SPC(1)
otask|=task|
FOR otask|=1 TO uloha&
IF ano$(otask|)="n" OR ano$(otask|)="N"
LPRINT meno$(otask|)+" - Kreslenie neviditelne"
ELSE
LPRINT meno$(otask|)+" - Kreslenie viditelne"
ENDIF
LPRINT q$(otask|)
LPRINT p$(otask|)
LPRINT
NEXT otask|
ELSE IF key$="r" OR key$="R"
RUN
ELSE IF key$="x" OR key$="X"
INC h|
IF h|=4
TITLEW #1,info$(task|)
h|=0
ELSE IF h|=2
TITLEW #1,cislo$(task|)+" Datum:"+datum$
ELSE IF h|=3
TITLEW #1,cislo$(task|)+" Nazov: "+meno$(task|)
ELSE IF h|=1
IF ano$(task|)="n" OR ano$(task|)="N"
TITLEW #1,cislo$(task|)+" Kreslenie neviditelne"
ELSE
TITLEW #1,cislo$(task|)+" Kreslenie viditelne"
ENDIF
ENDIF
ELSE IF key$="q" OR key$="Q"
CLOSES 1
~ OpenWorkBench()
SYSTEM
END
ELSE IF key$=CHRS(155)+CHRS(68)
DEC task|
IF task|<1
task|=uloha&
ENDIF
CLEARW #1
TITLEW #1,info$(task|)
PUT 0,0,ob$(task|)
PUT 151,0,oc$(task|)
ELSE IF key$=CHRS(155)+CHRS(67)
INC task|
IF task|>uloha&
task|=1
ENDIF
CLEARW #1
TITLEW #1,info$(task|)
PUT 0,0,ob$(task|)
PUT 151,0,oc$(task|)
ENDIF
LOOP
END
FilesParentsSiblings- Diplomová práca: Digitálne spracovanie obrazových sekvencií
- Galaxis: A Calendar and Encrypting Program (GFA Basic, Amiga)
SLOVAK ARTICLEJANUARY 1, 1980 AT 24:00:00 UTC
