Program na generovanie fraktálnych obrazov

Fractals EveryWhere 3.0



 

Program Fractals EveryWhere 3.0 pre platformu DOS :-( si môžete stiahnúť TU. Program so zdrojovým kódom v Céčku (vyľaduje DJGPP - port GNU C pre DOS a multimediálnu kniľnicu Allegro) si môľete stiahnú» TU. Túto dokumentáciu v HTML zasa TU

Úvod
 

Už od pradávna sa pokúšali rôzny umelci a i. zachytiť to čo vytvorila príroda. Postupným zlepšovaním zručnosti sa im to aj podarilo (spomeňme si napríklad na obdobie baroka). No doba sa od vtedy zmenila a to čo vtedy človek vedel dosiahnuť vlastnou rukou, to sa pokúša dnes prostredníctvom počítača a čo najjednoduchšie. Vytvorí si nejakú predstavu scény a snaží sa ju potom previesť na vizuálnu formu. Dnes pomocou profesionálneho programu na vytváranie scén sa vytvorí náčrt a celá práca sa uskutoční za pomoci výkonného počítača. Zo základnými poznatkami analytickej geometrie nie je problém si predstaviť ako prebiehajú výpočty sieťového modelovania. No, ale takýto sieťový objekt má ešte riadne ďaleko od realistického obrazu. Áno, chýba mu akási textúra, povrch a v neposlednom rade i tiene. Tento problém som si uvedomil aj ja a začal som sa zaoberať vytváraním textúr. Vezmime si napríklad povrch dreva. Ako túto textúru vytvoriť? S čím sa stretávame ešte stále, sú programy ktoré majú zoznam nafotených textúr a jednoducho povrch vytvárajú ukladaním textúry vedľa seba. Ak sa pozrieme na takto vytvorený objekt, rýchlo zbadáme nedostatky. A preto bolo treba vyvinúť lepšiu metódu, ktorá by generovala textúru s určitou náhodnosťou. Dobrým generátorom sú fraktály, ktorým sa venuje táto práca. Fraktály zahŕňajú širokú škálu rôznych druhov, mne sa najviac páčil tzv. Mandelbrotov súbor a preto program Fractals EveryWhere, ktorý je predmetom tejto práce ilustruje generovanie Mandelbrotovej množiny, no je stavaný tak aby sa dal použiť v prípade záujmu aj ako šetrič obrazovky. Je známe aj to, že fraktálne animácie pomáhajú pri psychoterapii, no takýmito pokusmi som sa nezaoberal ale snáď si nájde uplatnenie aj tam.
 
 

Myslím, že teraz je vhodný čas, kedy mi je cťou sa poďakovať:

  1. mojej tolerantnej rodine;
  2. mojej ?našliapanej mašine? - znie to síce čudne, ale musel som - urazila by sa;
  3. hlavne použitej literatúre a fantázii;
dávid čeljuska



Metodika práce
 

Program Fractals EveryWhere som postupne vyvíjal a pridával nové a nové funkcie, ktoré by lepšie ilustrovali tento prekrásny problém fraktálov. Zo začiatku do boli rekurzívne fraktály za pomoci ktorých sa dali vytvárať rôzne stromy, čipky, koberčeky, vločky, bublinky a i. No stále ma fascinoval tzv. Mandelbrotov súbor. Najprv som jednoducho opísal algoritmus publikovaný v [Beneš], neskôr, keď ma to už poriadne zaujalo som sa snažil pochopiť princíp generovania. Potom už naozaj nič nestálo v ceste aby sa úplne krátky algoritmus rozvinul. Neskôr som pridal i vlastné odvodené množiny, ktoré pracujú na obdobnom princípe, ale s inou funkciou. Keďže výpočty sú dosť pomalé, snažil som sa program zefektívniť. Skúšal som to realizovať na nižšej úrovni ako v Céčku, použiť celé čísla namiesto reálnych, no nič z toho nemalo zreteľný vplyv na rýchlosť.

Program Fractals EveryWhere 3.0 je celý napísaný v Borland C++ 3.1 (BC), použil som štandardné funkcie Céčka, mimo to som pre lepšie farebné rozlíšenie 256 farieb použil BGI ovládač svga256m.bgi, no niektoré funkcie bolo potrebné vytvoriť v inline assemblery BC. Program je odladený pre počítač s koprocesorom pre rýchlosť vykonávania výpočtov. Takýmto postupom sa program dopracoval k dnešnej podobe.

Do tejto dokumentácie som zahrnul aj celkové vysvetlenie pojmu fraktál a uviedol som i dva príklady vytvorenia fraktálov v programovacom jazyku C pre lepšie pochopenie.
 
 

1 Všeobecná charakteristika fraktálu

1. 1 Čo je fraktál
 

Pod pojmom fraktál môžeme rozumieť dve významy, ktoré sú dosť podobné. Fraktál môže predstavovať akýkoľvek vzor vytvorený prírodou, alebo iný prírodný útvar (napr. strom, trávnik, bublinky v limonáde, textúra dreva a i). Na druhej strane, sa môže fraktál chápať ako presne matematicky definovaná množina. Nad slovkom ?presne? sa zastavíme, pretože v mnohých prípadoch to predstavuje náhodu, ktorá je však matematicky generovaná - zdá sa že sa pomaly blížime k matematickej štatistike.

Krátka definícia fraktálu by znela asi: Fraktál je matematickým vyjadrením všetkého chaosu.

Tejto dokumentácii a nakoniec i v programe sa však venujem výhradne prísne nenáhodnými fraktálmy v podobe zobrazenia na obrazovke monitora a to v konečnej fáze v 2D, 3D v rovine a 3D zobrazenie v podobe magických obrázkov.

Keďže to pochopíte asi lepšie na príklade, tak si nasledujúci obrázok dobre prezrite.

obr. 1


Na prvý pohľad poviete, no čo, akási špirála, ale ono to tak nie je, pretože rovnako to môže byť kúsok z fraktálu.

Fraktály vznikajú nekonečným opakovaním istého útvaru, ktorý sa zmenšuje o nejaký násobok jedným smerom a druhým zase presne opačne - zväčšuje; a prípadne sa základ - tak budem nazývať základnú časť fraktálu, otočí o nejaký uhol, či posunie o nejaký vektor, alebo inak deformuje.

Tí šikovnejší iste postrehli, že základom na obr. 1 je čiara, ktorá sa skracuje o polovicu pôvodnej dĺžky predchádzajúcej čiary a zároveň sa otáča o uhol 90° a jej začiatok sa presúva na koniec predchádzajúcej čiary.

A teraz na rozcvičku zoberte papier, pravítko a ceruzu a začnite kresliť, pekne podľa opísaného návodu. Nezabudnite, že tak ako sa čiary jedným smerom skracujú tak sa druhým musia predlžovať.

Čoskoro ste asi prišli na to, že to nespravíte, pretože vám nevystačí papier, alebo ste zabudli deliť.

Teraz si pre fraktál z obr. 1 skúste spraviť program, popremýšľajte nad matematickým, neskôr programovým algoritmom a začnite. Nemal by to byť problém ani pre začiatočníka.
 
 

Pre tých, ktorým to neide, jeden možný variant:

#include<math. h>

#include<graphics. h>

#define PI 3. 1415926535 //Ludolfovo číslo p

#define POC 7 //počet čiar - interácii

void main(void)

{

int gd=DETECT, gm;

int j, x2, y2, x1=320, y1=240, alf, d=100;

initgraph(&gd, &gm, ""); //očakávam, že grafický ovládač *. bgi máte v aktuálnom adresári

//opakuj pre zadaný počet čiar - ďalej INTERACII

//zmeň uhol o 90°

for(j=0, alf=90;j<POC;j++, alf-=90)

{

x2=d*sin(alf*PI/180); //vypočíta prírastok - D x

y2=d*cos(alf*PI/180); //D y

line(x1, y1, x1+x2, y1+y2); //kresli čiaru z bodu x1, y1 do bodu x1+x2, y1+y2

x1+=x2; //pripočíta x2 k x1

y1+=y2;

d/=2; //dĺžka čiary na pól

}

}

Hlasí program chybu ? Skúste sa pozrieť, či grafické ovládače (*. bgi) sú v aktuálnom adresári, ak nie do prázdnych ?? vložte cestu k nim. Alebo sa presvedčte či máte nastavené OPTIONS - LINKER - LIBRARIES - GRAPHICS LIBRARY .

Ak vám to doteraz nie je jasné ďalej nečítajte, ale skúste to zvládnuť.

Otázka pre vás: Aká dlhá je vzniklá, lomená - špirálová čiara celého fraktálu?

Áno, je nekonečne dlhá, nekonečne krát lomená a skladá sa z nekonečného počtu základných čiar.

Poznámka: Ak by sme časť tohto fraktálu zväčšili presne toľko krát, koľko sme čiaru delili, uvideli by sme znova presne to isté ako na počiatku, a tak by sme mohli zväčšovať dokedy? No predsa do nekonečna. A znova to nekonečno, nuž pri fraktáloch stále treba hovoriť o nekonečnu.
 
 

Myslím, že by sa patrilo už spomenúť definíciu fraktálu: Fraktál je množina, ktorej Hausdorfova dimenzia je väčšia než topologická. Pričom topologická dimenzia je ta ktorú určite všetci poznáme (poznáme 0D, 1D, 2D, 3D) a Hasdorfova dimenzia vyjadruje mieru členitosti, je pre ňu charakteristické,

že je neceločíselná (napríklad 2,13).
 
 

1. 2 Sebepodobnosť
 
 

Podobnosťou sme sa prvý krát stretli na základnej škole - myslím, že išlo i podobnosť trojuholníkov a nejaké poučky: 2 trojuholníky sú podobné ak sa zhodujú minimálne v 2 uhloch atď.

No, nemá to ďaleko od podobnosti, ktorá bude zaujímavá pre nás.

Sebepodobnosť nachádzame všade tam, kde si to najmenej uvedomujeme. Príkladom sebepodobnosti môžu byť stromy, kameň, steblo trávy, atď. Vezmime si kameň a skalu, zistíme, že najväčšiu odchýlku medzi nimi dvoma tvorí ich veľkosť. Pri steble trávy, nachádzame približne rovnaké steblá po celom trávniku, alebo bublinky v limonáde, všetky sa takmer navzájom podobajú.

Ak máte záujem hlbšie spoznať matematické vyjadrenie sebepodobnosti, či fraktálu tak vás odkazujem na [Žára], [Peitgen-Saupe] a [Peitgen-Richter].
 
 

1. 3 Ako to všetko začalo
 
 

Ťažko presne určiť ?kde??, ?kto?? a za ?akých okolností??, pretože ako všetko (myslím, že všetko) nezačalo to len tak z ničoho nič - naraz, spontánne; ale dlho sa vyvíjalo až nakoniec prišlo do takých podôb v ktorých to poznáme my.

Nuž ale predsa tým najstarším stvoriteľom fraktálu bola príroda, pretože tá má za následok to, že si to začal uvedomovať aj človek - inak by sme možno na to nikdy neprišli.

Ľudia sa snažili pochopiť chaostickosť prírody, a tak začali skúmať chaos - vyzerá to čudne, ale ak chcem zachytiť - nakresliť strom - dokonalý strom; tak musím tieto zákony poznať. Medzi najväčších ľudí v tejto oblasti, patrí Benoid B. Mandelbrot - Varšava 1924, on ako prvý popísal fraktál.

Na pracovisku vo firme IBM, sedí pán B. B. Mandelbrot a skúma chyby, ktoré vznikajú prenosom dát v počítači. Zistí chybu, zoberie kvalitnejšie meracie prístroje a zistí, že daná chyba obsahuje podobné chyby, tvar obidvoch chýb bol podobný - nevedel túto podobnosť pochopiť, a tak sa začal s tým hlbšie zaoberať a fraktál bol na ceste.
 
 

1. 4 Mandelbrotová množina
 
 

Prichádzajú na svet nové fraktály a my na predchádzajúci spôsob generovania fraktálov môžeme v pohode zabudnúť, pretože tento spôsob pracuje na úplne inej, zaujímavejšej filozofii.

Tento spôsob generovania bude pre mnohých z vás tak troška záhadnejší, samozrejme až do vtedy,

pokiaľ odkryjeme celé tajomstvo.

Tu nebudeme potrebovať, žiadne smernice, uhly, a iné, ktoré sme nevyhnutne potrebovali pri predchádzajúcej metóde, ale tou veľkou zbraňou budú práve tak, možno v škole nenávidené komplexné čísla.

Tento druh generovania obrazov zašiel tak ďaleko, že sú usporadúvané rôzne výstavy tzv.

art-ware, kde práve oni víťazia. Áno, opäť to bol Manelbrot, ktorý prvý popísal tieto súbory - množiny a preto sa niet čomu diviť, že sú pomenované podľa neho.

Ak by sme chceli interakčne - za pomoci cyklu (krokovo); skúmať dynamický systém, ktorý je vyjadrený komplexnou parabolou Zi+1=Zi2 + Ci , dospeli by sme k algoritmu, ktorý popísal v roku 1918 - teda dávno pred vynájdením počítača Gaston Julia a Pierre Fatau.

Tieto fraktály sa vykresľujú na obrazovku po bodoch. Vykresľované zaradom a pre každý bod t.j. pre každú súradnicu sa určí jej farba - teda pri monitoroch s lepšou rozlišovacou schopnosťou a s väčším počtom farieb dosiahnete krajší obrazec. Táto farba sa určí ako rýchlosť daného bodu, ktorou opustí kruh o polomere 2. Pozri podčiarknutý cyklus while v programe. X-ovou súradnicou bodu je reálna časť C a y-ovou je imaginárna časť C. Potom sa podľa uvedeného vzťahu počíta úniková rýchlosť - cyklus sa opakuje pokým nie je absolútne Z > alebo = ako 2. , alebo po dosiahnutí pracovného nekonečna - t.j. úniková rýchlosť je veľmi malá teda cyklus by sa musel vykonať veľmi veľa krát - tak jednoducho povieme, že sme dovŕšili pracovné nekonečno.
 
 

#include<conio. h>

#include<stdio. h>

#include<graphics. h>

void main(void)

{

int gd=DETECT, gm;

initgraph(&gd, &gm, "");

int i, j;

struct palettetype pal;

getpalette(&pal); //načíta paletu

for(i=1;i<pal. size;i++)setrgbpalette(pal. colors[i], 4*i, 5, 4*i); //nastaví paletu farieb

/*

float maxy=-0. 22, miny=-0. 32;

float maxx=-0. 65, minx=-0. 75;

*/
 
 

/*

float maxy=-0. 25, miny=-0. 29;

float maxx=-0. 68, minx=-0. 72;

*/

float maxy=2, miny=-2;

float maxx=2, minx=-2;

float X=480, Y=480;

float MAXkrok=48, krok, zr=0, zio, zi=0, cr, ci, prirasx, prirasy;

prirasx=(maxx-minx)/X; //vypočíta príratok pre krok

prirasy=(maxy-miny)/Y;

cr=minx-prirasx; //inicializuje reálnu časť C

for(i=0;i<X;i++) //cyklus pre riadky

{

cr+=prirasx;

ci=miny-prirasy;

for(j=0;j<Y;j++) //cyklus pre stĺpce

{

ci+=prirasy;

zr=zi=0;

krok=0;

do

{

zio=zi; //uloženie starej imaginárnej časti Z

// pre rovnicu Z=Z+C

/*

zi=zi+ci;

zr=zr+cr;

*/

//pre rovnicu z=z*z+c

zi=2*zr*zi+ci;

zr=zr*zr-zio*zio+cr;

//pre rovnicu z=z*z*z+c

/*

zi=3*zr*zr*zi-zi*zi*zi+ci;

zr=zr*zr*zr-3*zr*zio*zio+cr;

*/

//pre rovnicu z=z*z*z*z+c

/*

zi=4*zr*zr*zr*zi-4*zr*zi*zi*zi+ci;

zr=zr*zr*zr*zr-6*zr*zr*zio*zio+zio*zio*zio*zio+cr;

*/

krok++;

}

while((zr*zr+zi*zi)<=4 && krok < MAXkrok);

putpixel(i, j, (int)krok%16);

}

}

getch();

closegraph();

}

Tento program potrebuje rozlíšenie 640x480x16 a vykreslí Mandelbrotovú množinu Z=Z? Z+C.

Zmenou premenných X a Y zmeníte veľkosť obrázka, zmenami xmax, xmin, ymax, ymin zmeníte detail, ktorý chcete vidieť - tzn. môžete spraviť program ktorým by bolo možné nejaký detail zväčšiť, a tak sa dopracovať k nádherným obrazcom - viď nasledujúci program.

Premennou MAXkrok nastavujete pracovné nekonečno.

V tele podčiarknutého cyklu while môžete zmeniť rovnicu, alebo spraviť kombináciu dvoch a atď.

Ako som na tie vzorce v tele cyklu while prišiel?

Z=Z+C Z=Z ? Z + C

Zr + Zi ? i = Zr + Zi ? i + Cr + Ci Zr + Zi ? i = ( Zr + Zi ? i ) ? ( Zr + Zi ? i ) + Cr + Ci ? i

Zr = Zr + Cr a Zi ? i= Zi ? i + Ci Zr + Zi ? i = Zr ? Zr + 2 ? Zr ? Zi ? i - Zi ? Zi + Cr + Ci ? i

Zr = Zr ? Zr - Zi ? Zi + Cr a Zi ? i = 2 ? Zr ? Zi ? i + Ci ? i

Kde: Zr - je reálna časť Z

Zi - je imaginárna časť Z

Cr - je reálna časť C

Ci - je imaginárna časť C

A tak podobne i pri Z=Z ? Z ? Z + C a Z=Z ? Z ? Z ? Z + C

Tieto uvedené vzorce treba chápať ako priradenie, teda Z na ľavej strane je vlastne Zk a Z na pravej strane je Zk-1.

2 Popis programu Fractals EveryWhere a analýza jednotlivých algoritmov
 
 

2. 1 Odporúčané požiadavky na hardware a software počítača
 
 

Osobný počítač rady 80586 (iP) a vyššie

Veľkosť volnej operačnej pamäte 500Kb

Operačný systém DOS (PC Dos, IMB Dos, MS Dos a i.)

Grafická karta SVGA 1MB

Zvuková karta kompatibilná so SoundBlaster alebo SoundBlaster Pro

Myš kompatibilná s Microsoft Mouse alebo s MouseSystems

Verzia 3.0 navyše potrebuje graficky interpreter UNIVBE 5.1 a vyššie
 
 

2. 2 Príkazový riadok DOSu a syntax
 
 

SYNTAX: FR_98_30.EXE [ON|OFF 1|2|3|4 X1 Y1 X2 Y2 ON|OFF P|L ON|OFF W|N] | [/?]

kde:

ON|OFF - zobrazovať ÚVOD?

1|2|3|4 - nastavenie východzej množiny X1 Y1 X2 Y2- nastavenie počiatočného detailu ON|OFF - či zobrazovať ovládací panel P|L - čí vo funkcii 3D používať čiarové alebo bodové zobrazenie ON|OFF- či používať výstup na Sound Blaster 220h W|N - či automaticky spustiť funkciu WAY - (sekvenčná zmena paliet)

2. 3 Popis funkcii programu
 
 

Program je hudobne podfarbený a pracuje v režime 640x480 s 256 farbami.

Zväčšenie detailu danej množiny:

Prevádza sa jednoduchým kliknutím myši na daný detail. Zväčšenie je dvojnásobné a miesto kliknutia myši bude v strede vykresľovanej plochy.

Návrat o jednu úroveň naspäť - zmenšenie:

Vykonáva sa stlačením tlačitka ?Zoom Out?. Vráti sa to o jednu úroveň vyššie. S vnorovaním (zväčšovaním) a s vynorovaním (zmenšovanie) súvisí počet vnorení, ktoré je schopný program vrátiť

a je to nastavene na hodnotu 20 t.j. že 20-krát sa môže použiť funkcia ?ZoomOut?. Bližší popis bude opísaný neskôr.

Zmena vykresľovanej množiny:

Verzia 3.0 umožňuje zobraziť 4 druhy fraktálov a to množinu Z=Z*Z+C, Z=Z*Z*Z+C, Z=Z*Z*Z*Z+C a množinu Z=Z+C. Vykonáva sa to stlačením tlačitka s nápisom aktuálnej množiny.

Zmena palety:

Program umožňuje zmeniť farebnú paletu na 8 rôznych preddefinovaných paliet. Vykonáva sa to stalčením tlačitka ?Palette?.

Plynulá zmena palety - Way:

Program umožňuje postupne meniť palety farieb a tým dosiahnuť dojem ?sveteľného hada?. Touto funkciou sa dá nastaviť akákoľvek paleta. Stlačením tlačitka ?Way? sa tato funkcia vykoná.

Zobrazenie 3D v rovine:

Program umožňuje daný fraktál aj pre lepšiu predstavivosť previesť do 3D grafiky jednoduchým stlačením tlačitka ?3D?. Vo funkcii 3D sa dá nastaviť pohľad na daný fraktál - otáčanie fraktálu.

Otáčanie sa prevádza šípkami kláves. Potvrdenie pohľadu, klávesou Esc alebo Space.

K tejto funkcii je potrebne mať na disku voľný priestor cca 250Kb inak je funkcia automaticky deaktivovaná. Vykreslenie sa môže uskutočniť buď čiarovo alebo bodovo. Nastavenie týchto volieb sa musí previesť v príkazovom riadku Dosu.

Zobrazenie 3D za prostredníctvom magických obrázkov - 3D Coding:

Medzi zaujímavé funkcie patri aj táto, ktorá prevedie daný dvojrozmerný obraz - fraktál do krásnej 3D scény. Daný fraktál sa zakóduje tak, že škúlením sa dosiahne to, že sa nám daný obraz vynorí z plochy a oči ho vnímajú ako prekrásny 3D obraz. Vykonáva sa to jednoduchým kliknutím na tlačitko ?3D Coding?.

Funkcia SaveAs:

Funkcia uloží práve aktuálne vykreslený fraktál do obrázku PCX na disk do požadovaného adresára.

Funkcia Load:

Umožní nahrať fraktál PCX z disku zo zadaného adresára.

Help:

Zobrazí Help pre používanie programu

Quit:

Ukončenie programu Fractals EveryWhere ?
 
 

2. 4 Realizácia jednotlivých funkcii
 
 

Asi čo bude každého skúsenejšieho čitateľa zaujímať bude, ako som jednotlivé funkcie riešil a teda tu je pravá chvíľa odkryť tajomstvo.

Pri každej zmene detailu, alebo rovnice sa pri vykresľovaní fraktálu údaje o rýchlosti za ktorou opustí bod kruh o polomere 2 ukladajú do súboru ?fractals.dat?. Tento súbor je využívaný pri vykreslení obrázka - fraktálu ak sa vraciame z menu ?Help?, ?3D?, či ?3D Coding? a i.

Rýchlosť bodu ktorou opustí bod kruh je v 2D zobrazení realizovaná ako číslo farby a v 3D zobrazení ako výška daného bodu nad vodorovnou rovinou.

Zväčšovanie:

Funguje na veľmi jednoduchom a elegantnom spôsobe kedy stačí zistiť súradnice myši v momente kliknutia (prevedie službou myši AX=05h prerušením INT 033h). Následné sa prepočítajú súradnice na súradnice fraktálu a podľa toho sa upravia premenné x1,x2,y1,y2 a celý fraktál sa znova vykreslí. Pri tom sa však ešte uložia súradnice pôvodného detailu do poľa z ktorého sa pri prípadnom ?ZoomOut? výberu.

Zmenšovanie:

Pracuje na obdobnom princípe ako Zväčšovanie. Len sa z príslušného indexu poľa výberu hodnoty x1,x2,y1,y2, posunie sa index o jedno zpäť a následne sa fraktálny detail prekresli s novými hodnotami x1,x2,y1,y2.

Zmena množiny:

Pri výpočtoch fraktálu sa použije iná rovnica a cely fraktál sa prekresli (v cykle while v algoritme na vykreslenie Mandelbrotovej množiny).

Zmena palety:

Uskutočňuje sa sekvenčnými zmenami farebnej palety (konkrétne od farby 16-255 pretoze prvých 16 farieb je vyhradených ako základné farby). Fraktál sa nemusí od znova vykresľovať takže sa

jednoducho prejde na testovanie aktívnosti ďalších funkcii.

Plynulá zmena palety:

Tato funkcia sa vykonáva postupným posúvaním RGB zložiek farby pre jednotlivé farby a to tak, že zložky farby 2 sa uložia do farby 1, zložky farby 3 do farby 2 atď. RGB zložky farby 255 sa inkrementujú o náhodné číslo v rozsahu 0-1 (napr. R=R+rand()%2; pre G a B to isté). Tým sa dosiahne približne plynulá zmena palety a teda vyzáž fraktál ma peknú štruktúru. Ak by sa použila iba klasická zmena palety, tak by sme asi nič nevideli, pretože by obraz nehorázne blikal a preto to treba synchronizovať s návratom lúča obrazovky na polohu 0,0. Takto sa docieli, že obraz nebliká. Počká sa kým sa obraz dostane na koniec obrazovky (pravý dolný roh) realizácia: while ((inp(0x3da)&8)==0); a potom sa zmenia palety. Následným vykreslením sú už palety zmenené.

Zobrazenie 3D v rovine:

Táto funkcia je pomerne zložitejšia ako ostatné, ale stačí sa zamyslieť nad pár sínusmi a kosínusmi

a pomocou nich vyjadriť výšku jednotlivých bodov. V tejto funkcii sa dá otáčať pohľad. Otáčanie sa prevádza pomocou otáčania obdĺžnika. Tento obdĺžnik sa nemôže vykresľovať tradičnou funkciou line(), ale musí sa použiť vlastná funkcia ktorá vykresli čiaru po bode pretože inak by sa obraz prekresľoval, musím si buď zapamätať aká farba leží pod obdĺžnikom a nasledne ju obnoviť, alebo použiť logickú funkciu. Ja som použil logickú funkciu XOR. Tým sa dosiahne to, že keď sa bod dvakrát XORne tak sa dosiahne pôvodná farba. Teda vykreslím obdĺžnik po čiarach tak, že spravím XOR so 14 a potom keď chcem zmazať obdĺžnik tak nakreslím ho vlastne ešte raz a opäť použijem XOR.

3D zobrazenie sa vykonáva zo súboru v ktorom mám uložené údaje o fraktále. 3D sa zobrazuje stále od konštantnej hrany obdĺžnika takže ak je táto hrana najnižšie z ostatných 3 hrán tak sa obraz nevykresli korektne pretože jednotlivé už predtým nakreslené body sa zmažu. Toto sa však dá odstrániť, ale bolo by sa treba viac ponoriť do tajomstiev 3D zobrazenia.

Zobrazenie 3D - magický obrázok:

Obrázok sa zakóduje tak že vzniklý obrázok má 16 základných farieb. Najprv za na ľavom okraji nakresli náhodný vzor o šírke 100 bodov. Kódovanie prebieha po riadkoch a postupne sa číta z obrazovky farba bodu podľa ktorej sa posunie čítanie farby ktorú vykresľuje. Farba ktorú ukladá

na obrazovku sa zisťuje podľa už nakresleného obrázka. Týmto spôsobom sa môže stať že sa obrázok

nepekne zakóduje t.j ako vzor sa použije sám obrázok.

ukážka kódovania: - jednotlivé body sú realizované písmenom.

pred kódovaním:

vzor obrázok

abcdefghijkl ABCDEFGHIJKLMNOPQRSTUVWXYZ

Na začiatku ukazuje smerník1 na prvý bod ?a? a smerník2 na bod ?A?. Načíta sa hodnota farby kde ukazuje smerník2 ?A?. Následne sa prečíta číslo farby na súradnici smerník1 + hodnota načítanej farby ?A? a vykreslí sa bod s touto hodnotou na súradnicu smerniku2 ?A?. Ak by bolo ?A? = 5 tak sa načíta zo vzoru hodnota ?e? a bod ?A? sa prekreslí bodom o farbe ?e?. Potom smernik1 a smerník2 budú ukazovať na bod o jedno ďalej, teda smerník1 na bod ?b? a smerník2 na bod B.

po kódovaní prvého bodu ak ?A?=5 :

vzor obrázok

abcdefghijkl eBCDEFGHIJKLMNOPQRSTUVWXYZ

Treba poznamenať že vykreslený bod ?e? sa stáva tak isto vzorom, teda môže sa stať, že sa bude podľa neho kódovať nejaký bod za týmto bodom. Každý riadok sa kóduje presne takýmto spôsobom.

Príklad:

vzor obrázok

7854213 134547

7544786 546412

po kódovaní celého obrázka:

vzor obrázok

7854213 741777

7544786 777676

Samozrejme že obrázok musí byť širší ako vzor a vzor by mal byť maximálne široký ako vzdialenosť stredov očí 6 cm. V programe je to 100 bodov - cca 4cm.

Funkcia SaveAs:

Táto funkcia, ako som spomenul, uloží fraktál do bitového obrázku PCX. Využíva sa i toho, že hlavička formátu PCX obsahuje 58 bytov voľných pre vlastné potreby aplikácii. Ja som toto miesto využil na ukladanie informácii detailu, teda uložia sa tam hodnoty minx, maxx, miny, maxy, ktoré sú parametrami fraktálu a aj informácia, ktorá uchováva o ktorú množinu vlastne ide.

Z tohto dôvodu je možne uložený a neskôr nahratý fraktál znovu použiť na zväčšovanie a iné prepočty. Ak by sa tieto informácie neukladali nedalo by sa napríklad do načítaného fraktálu vnorovať. Z toho dôvodu sa dá nahrať iba fraktál uložený programom Fractals EveryWhere. Identifikuje sa to pomocou identifikačného reťazca uloženého v súbore PCX taktiež vo vyhradenom mieste hlavičky 58 bytov.

Funkcia Load:

Väčšina už bola popísaná u funkcii SaveAs. Slúži na nahratie už uloženého fraktálu. Pri vyvolaní sa automaticky kontroluje, či daný súbor bol uložený programom Fractals EveryWhere, ak nie funkcia vypíše chybové hlásenie.

Všeobecne:

Pri volaní z hociktorej z funkcie sa vypína kurzor myši aby na obrazovke nevznikali nekorektné útvary a po vykonaní sa kurzor znova zapína. Pri kliknutí na tlačitko si je možné povšimnúť vylúdenie tonu z Vašej zvukovej karty v podobe ?tik?. Prehrávanie sa uskutočňuje prehratím krátkeho súboru Wave na zvukovej karte. Program vie nadetekovať automaticky zvukovú kartu na porte 220h. Ak ju nenájde tak sa zvukový výstup evidentne neuskutoční. Prehráva sa súbor 8bit na 22khz. Keďže formát Wave je úplné bez kompresie stačí jednoducho hodnoty zvukového signálu posielať na port 220h.

Zvuková karta môže byť teoreticky na portoch od 210h-270h. Program však skúma iba najčastejší port na ktorom sa zvukove karty zvyknú nachádzať. Nestretol som za zatiaľ so žiadním počítačom, ktorý by mal zvukovú kartu inde ako na 220h.

Ukážky fraktálov vytvorených pomocou tohto programu:

pod každým obrázkom nájdete charekteristické parametre pre daný fraktál.
 
7

 

Záver
 

Dospeli sme k záveru príručky a ak ste teraz na záver boli fascinovaný touto prekrásnou vedou, pritom pochopili jej princíp a prevedenie v programe Fractals EveryWhere (C) - DCSoft; tak to splnilo svoj cieľ a ja sa teším tiež. Ak ste pochopili, že za všetkým zdanlivo ničím zvláštnym sa skrýva niečo prekrásne, vedecké a matematika, ktorá je naozaj všade tak ma tešíte ešte viac. Jedna z publikácii [Peitgen-Saupe] sa volá The Science of Fractals Images - Veda z fraktálnych obrazov.

Fraktály sa čoraz častejšie objavujú na nepredvídateľných miestach. Objavujeme ich v biológii, meteorológii, v medicíne, v chémii, astronómii, pri prenose dát a zaujímavé je to, že fraktálne animácie pomáhajú pri psychoterapii.

Zaujímavou časťou využitia fraktálov je tzv. systém IFS, ktorý sa používa na kompresiu dát. Tento systém pracuje so stratami a dal by sa využiť pre kompresiu obrázkov, poprípade zvuku. Jeho použitím by sa dosiahli veľké kompresné pomery, no výpočty by boli o to pomalšie.

Program Fractals EveryWhere je zrkadlom môjho záujmu o túto disciplínu a je na takej úrovni, že by sa dal porovnať s programom FractInt 19.5 (? 1990-96 ), ktorý vytvorila veľká skupina autorov (Stone Soup Group).
 

Resumé
 

Tahle príručka je velmi neobyčejná protože se zaobírá tvorbou abstraktných fraktálnych obrazů hlavne tzv. Manelbrotova souboru v novém světe počítačové grafiky a zároveň prináši popis programu Fractal EveryWhere 3.0. Tahle problematika síce ještě nemá nějak velký uplatnění v praxe, ale domnívám se, že nebude dlouho trvat a tahle disciplína bude mýt exponeciálni nárůst v praxi. Zatím nalézá uplatnění při kompresi - zhušťovaní dát, používá se tu tzv. IFS. Jenže doposud to je velice pomalé a nepoznáme efektivní algoritmus, kterej by byl schopen najít atraktor a k němu afinní transformace. Ale tahle část fraktálnej vědy je mimo našich sil a proto ji zanechávám skutečným vědátorům.

Fraktály v šesti plno-farebnejch obrázků a množství černobílých najdete zde v této příručce s množství dalších a důležitých informacích o jejích tvorbě a spusobě implementovaní do programu Fractals EveryWhere.
 
 

Bibliografia
 
 

[Beneš] Beneš Bedřich: Fraktály, BAJT 3,4/91

[Peitgen-Richter] Peitgen H.-O. ? Richter P.H.: The Beauty of Fractal, Springer-Verlag New York Berlin Heidelberg Tokyo 1986

[Peitgen-Saupe] Peitgen H.-O. ? Saupe D.: The Science of Fractal Images, Springer-Verlag

New York Berlin Heidelberg London Paris Tokyo 1988

[Žára] Žára J.: Počítačová grafika - princípy a algoritmy, GRADA a.s. Praha 1992