Fraktály Benoita Mandelbrota

Mandelbrotova množina (JavaScript)

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é...

Gallery Image 1
Gallery Image 2
Gallery Image 3

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

Tomáš Fülöpp
October 6, 1991 ~ June 1992
Tomáš Fülöpp
January 15, 2026 ~ January 18, 2026
Tomáš Fülöpp (2012)

Downloadable filesFiles

Parents of this entryParents

Siblings of this entrySiblings

Related linksRelated links

Tagsbenoit mandelbrotcommodore amigafractalsvisualizationmandelbrot setprojectperformancegfa basicprogramming
LanguageSLOVAK Content typeARTICLELast updateJANUARY 1, 1980 AT 24:00:00 UTC