Obsah
1. Fraktály naprogramované v assembleru podruhé
2. Výpočet Juliovy množiny s využitím matematického koprocesoru
3. Animace Juliovy množiny
3.1 První varianta animace Juliovy množiny
3.2 Druhá varianta animace Juliovy množiny
4. Intra s tematikou fraktálů
4.1 Intro „Fractals“
4.2 Intro „FracZoom“
4.3 Intro „Anapurna“
4.4 Intro „poledne-dot-com“
4.5 Intro „mandelbrot is possible“
4.6 Intro „Mars“
4.7 Intro „Fractia“
4.8 Intro „Palikka“
5. Dema obsahující fraktály
6. Odkazy na další informační zdroje
7. Obsah dalšího pokračování tohoto seriálu
1. Fraktály naprogramované v assembleru podruhé
V předchozí části tohoto seriálu jsme si ukázali několik jednoduchých a relativně krátkých aplikací naprogramovaných v assembleru (jazyku symbolických adres – JSA), které sloužily k vykreslení Mandelbrotovy množiny ve známém grafickém režimu 13h karty VGA, tj. v rozlišení 320×200 pixelů při použití barvové palety s 256 barvami. První tři minule uvedené programy pro svoji činnost vyžadovaly matematický koprocesor (FPU), popř. jeho programovou emulaci, a také procesor s instrukční sadou 80386. Poslední program si vystačil s pouhým procesorem řady 80286 bez matematického koprocesoru, protože místo operací v pohyblivé řádové čárce byly naprogramovány aritmetické operace prováděné v systému pevné řádové binární čárky (fixed point).
Dnes si také ukážeme několik programů i se zdrojovými kódy, které slouží pro vykreslení fraktálů. Bude se jednat o programy určené pro generování Juliovy množiny, při jejichž výpočtu je použita stejná iterační funkce jako u množiny Mandelbrotovy; liší se pouze vstupní podmínky při vstupu do programové smyčky. Kromě těchto demonstračních příkladů si ukážeme některá převážně starší intra a dema, ve kterých se fraktály vyskytovaly.
2. Výpočet Juliovy množiny s využitím matematického koprocesoru
V dnešním prvním demonstračním příkladu je ukázáno, jakým způsobem je možné vypočítat a vykreslit Juliovu množinu s využitím matematického koprocesoru (FPU). Při pohledu do zdrojového kódu si možná všimnete podobnosti s minule ukázaným programem, který sloužil pro výpočet Mandelbrotovy množiny. Podobnost samozřejmě není náhodná, protože iterační výpočet pro Mandelbrotovu množinu a množiny Juliovy je shodný, liší se pouze počáteční podmínky – zde konkrétně hodnoty ukládané na zásobník matematického koprocesoru. Ve zdrojovém kódu jsou zakomentovány dvě instrukce. Po jejich odkomentování by se generovala korektní Juliova množina, při zakomentovaných instrukcích se provádí neúplný test na překročení hodnoty bailout, výsledkem je však zajímavější obrázek s krystalickou strukturou.
Obrázek 1: Screenshot prvního demonstračního příkladuTento program pro svou korektní činnost vyžaduje pouze procesor minimálně řady 80286 (pravděpodobně i 80186) spolu s matematickým koprocesorem (8087, 80287) nebo jeho softwarovou emulací. Délka výsledného souboru typu COM je rovna 124 bytům, v případě odkomentování výše zmíněné dvojice instrukcí se program o šest bytů zvětší, tj. jeho velikost bude po překladu a slinkování rovna 132 bytům. Zdrojové kódy všech dnes předvedených demonstračních příkladů i jejich přeložené varianty je možné získat po kliknutí na tento odkaz. Následuje výpis zdrojového kódu programu, který je upraven pro v minulosti populární assembler TASM (Turbo Assembler) firmy Borland International:
; Vykresleni Juliovy mnoziny s vyuzitim instrukci FPU
; Autor: Pavel Tisnovsky 19.09.99
model tiny ; pametovy model CS=DS=SS<64kB
p386 ; povoleny instrukce procesoru 386+
SLOUPCU equ 320 ; pocet sloupcu na obrazovce
;*** zacatek data segmentu
dataseg ; zacatek data-segmentu
min dw -2 ; minimalni hodnota promenne xpos jako integer
ypos dd -2.0 ; pozice na vertikalni ose
posunx dd 0.015 ; posun po horizontalni ose
posuny dd 0.02 ; posun po vertikalni ose
c4 dw 4 ; bailout jako integer
p286
udataseg
zx1 dd ? ; hodnota komplexni promenne Z
zy1 dd ? ;
zy2 dd ?
xpos dd ?
; makra - nahrada primeho adresovani adresovanim pres registr BX
minptr equ word ptr [bx-16]
yposptr equ dword ptr [bx-14]
posunxptr equ dword ptr [bx-10]
posunyptr equ dword ptr [bx-6]
c4ptr equ word ptr [bx-2]
zx1ptr equ dword ptr [bx]
zy1ptr equ dword ptr [bx+4]
zy2ptr equ dword ptr [bx+8]
xposptr equ dword ptr [bx+12]
;*** zacatek kodoveho segmentu
codeseg ; zacatek code-segmentu
org 100h ; zacatek kodu pro programy typu COM
p386
start:
mov al,13h ; graficky mod 13h
int 10h
push 0a000h
pop es ; video segment
xor di,di ; zacatek vykreslovani na obrazovce
mov bx, offset zx1 ; inicializace pro relativni adresovani
fld yposptr
for_y: mov si,SLOUPCU ; x
fadd posunyptr ; ypos+=4.0/200.0
fild minptr ; xpos=-2
fstp xposptr
for_x:
fld xposptr
fadd posunxptr ; xpos+=4.0/260.0
fst zx1ptr ; zx1
fstp xposptr
fld st(0)
fstp zy1ptr ; zy1
mov cl,50 ; maximalni pocet iteraci
smycka: ; zasobnik FPU
fld zx1ptr ;\ zx1
fmul st(0),st(0) ; > zx2=zx1*zx1 zx1*zx1
fld st(0) ;/ zx2 zx2
fld zy1ptr ;\ zy1 zx2 zx2
fmul st(0),st(0) ; > zy2=zy1*zy1 zy2 zx2 zx2
; fst zy2ptr ;/ zy2 zx2 zx2
fld zx1ptr ;\ zx1 zy2 zy2 zx2 zx2
fmul zy1ptr ; \ zx1*zy1 zy2 zy2 zx2 zx2
fadd st(0),st(0) ; > zy1=2*zx1*zy1+cy 2*zx1*zy1 zy2 zy2 zx2 zx2
fld1 ;
fadd ; / 2*zx1*zy1+ccy zy2 zy2 zx2 zx2
fstp zy1ptr ;/ zy2 zy2 zx2 zx2
fsubp st(1), st(0) ;\ zx2-zy2 zy2 zx2
fstp zx1ptr ; /` zx1=zx2-zy2+cx zy2 zx2
;/
; fadd zy2ptr ; zx2+zy2>4 ?
ficomp c4ptr
fstsw ax ; FPU priznaky do AX
sahf ; predani FPU priznaku do priznakoveho registru
jnb short pokr ; pokud jsme prekrocili bailout, konec
loop short smycka
pokr:
xchg ax,cx ; pocet iteraci do AL -> barva pixelu
stosb ; vykreslit bod+posun na dalsi
dec si
for_x_: jnz short for_x ; dalsi radek
cmp di,64000 ; konec obrazku ?
for_y_: jne short for_y ; konec smycky for y
xor ax,ax ; cekat na klavesu
int 16h
mov ax,3 ; textovy rezim
int 10h
retn ; finito
end start
3. Animace Juliovy množiny
Poměrně efektní bývají v demech a intrech animace Juliových množin. Ty se ve většině případů provádí jednoduše – každý obrázek v animaci je vypočítán s odlišnou hodnotou komplexní konstanty C použitou v iterační funkci Zi+1=Zi2+C. Pokud se v sousedních obrázcích hodnota této konstanty odlišuje o malou hodnotu, například její velikost (absolutní hodnota) o pouhou jednu setinu, vzniká při spuštění dojem plynulé animace. Konstanta C, kterou si můžeme představit jako bod v komplexní rovině, se může měnit různými způsoby, například systémem „cik-cak“ (nejprve se mění reálná složka, poté složka imaginární), pohybem bodu po kružnici, spirále atd.
3.1 První varianta animace Juliovy množiny
Ve druhém demonstračním příkladu je ukázán způsob vytvoření animace Juliovy množiny postupnou změnou programových konstant cx a cy – jedná se o reálnou a imaginární složku komplexní konstanty C. V tomto programu nejsou využity funkce matematického koprocesoru (FPU), protože se veškeré výpočty provádí v systému pevné řádové binární čárky. Vzhledem k použití třicetidvoubitových operandů některých instrukcí je však nutné použít procesor řady 80386 nebo jakýkoli vyšší.
Původní program byl poněkud jednodušší, protože byl odladěn na počítači s procesorem IBM 80486DX2 Blue Lighting (66 MHz @ 80 MHz), ale při spuštění na dnešních počítačích byla animace příliš rychlá. Proto je do programu vložena smyčka provádějící synchronizaci animace s elektronovým paprskem obrazovky (nebo s přechodem na první obrazový řádek v případě LCD).
Obrázek 2: Screenshot ze druhého demonstračního příkladu; Prvni demonstracni program pro vykresleni animovane Juliovy mnoziny.
; Autor: Pavel Tisnovsky
model tiny ; pametovy model CS=DS=SS<64kB
dosseg
p386 ; povoleny instrukce procesoru 386+ (ale pouze pro dword konstanty)
P equ 65536 ; binarni tecka ve fixed-point formatu
K equ 4*P/128 ; vzdalenost mezi dvema body v rovine (krok smycky)
MIN equ -2*P ; minimalni a maximalni hodnota konstant fraktalu
MAXITER equ 64 ; maximalni pocet iteraci
STATUS_REG equ 3DAh ; stavovy registr karty VGA
p286 ; zpet na sestnactibitovy kod
dataseg
CX_ dd -100000 ; imaginarni konstanta pro iteraci
CY_ dd -80000 ; vse ve fixed point formatu
PCX dd 4000 ; posun realne casti konstanty
udataseg
X dw ? ; pozice ve fraktalu
Y dw ?
ZX1 dd ? ; komplexni cisla
ZY1 dd ? ; komplexni cisla
ZX2 dd ? ; komplexni cisla
ZY2 dd ? ; komplexni cisla
ZX3 dd ? ; komplexni cisla
ZY3 dd ? ; komplexni cisla
codeseg ; zacatek code-segmentu
org 100h ; zacatek kodu pro programy typu COM
start:
mov al,13h ; VGA graficky rezim 13h
int 10h
push ds ; nastaveni barvove palety
mov ax,0a000h
mov ds,ax
mov es,ax
xor ah,ah
xor bx,bx
mov al,63
palopak:
mov [bx],al
mov [bx+1],byte ptr 0
mov [bx+2],ah
mov [bx+64*3],ah
mov [bx+1+64*3],ah
mov [bx+2+64*3],al
mov [bx+128*3],al
mov [bx+1+128*3],byte ptr 63
mov [bx+2+128*3],ah
mov [bx+64*3+128*3],byte ptr 0
mov [bx+1+64*3+128*3],al
mov [bx+2+64*3+128*3],al
inc ah
dec al
add bx,3
cmp bx,64*3-1
jc palopak
;--- Nastaveni palety pres BIOS
mov ax,1012h ; sluzba 10h, podsluzba 12h
xor bx,bx ; offset prvni barvy
mov cx,255 ; pocet barev
xor dx,dx
int 10h ; volej BIOS
cld
pop ds
xor di,di
mov cx,63999
mov al,63
rep stosb
@opak00:mov ah,1 ; vymazani bufferu klavesnice
int 16h
jz short @kon00
xor ah,ah
int 16h
jmp short @opak00
@kon00:
p386
push 0A000h ; do ES adresu video RAM
pop es
opak:
mov di,11520+96 ; aby se fraktal vykreslil
mov bp,52608-320+95
mov eax,CX_ ; doprostred obrazovky
add eax,PCX ; posun konstanty
mov CX_,eax
cmp eax,100000 ; kontrola CX_
jg up ; CX_ osciluje mezi -100000 a 100000
cmp eax,-100000
jl up
jmp pp
up: neg pcx ; posun na opacnou stranu
add CY_,6000 ; posun CY_
cmp CY_,100000 ; kontrola CY_
jl pp
mov CY_,-80000
pp:
mov ZX1,MIN
mov X,64 ; fraktal bude velikosti 128x128
forx:
mov ZY1,MIN
mov Y,128
fory:
mov cl,MAXITER ; pocet iteraci
mov eax,ZX1
mov ZX2,eax ; ZX2:=ZX1
mov eax,ZY1
mov ZY2,eax ; ZY2:=ZY1
rep_:
mov eax,ZX2
sar eax,8 ; ZX3:=ZX2^2
imul eax
mov ZX3,eax
mov eax,ZY2
sar eax,8 ; ZY3:=ZY2^2
imul eax
mov ZY3,eax
mov eax,ZX2
sar eax,8 ; ZX2 div 256
mov ebx,ZY2
sar ebx,7 ; ZY2 div 256 * 2
imul ebx
add eax,CY_ ; ZY2:=ZX2*ZY2+CY_
mov ZY2,eax
mov eax,ZX3
sub eax,ZY3
add eax,CX_
mov ZX2,eax ; ZX2:=ZX3^2-ZY3^2+CX_
sub cl,1 ; pocitadlo iteraci
jz short pokrac
mov eax,ZX3
add eax,ZY3
cmp eax,4*P ; kontrola bailout
jc short rep_
pokrac:
mov al,cl
shl al,2
mov es:[di],al ; vykreslit bod
mov es:[bp],al ; a k nemu symetricky bod
dec bp
inc di ; dalsi bod
add ZY1,K ; ZY1:=ZY1+K
sub Y,1 ; Y:=Y-1
jnz fory
add di,320-128 ; dalsi radek
sub bp,320-128
add ZX1,K ; ZX1:=ZX1+K
dec X
jnz forx
; synchronizace s paprskem monitoru
mov dx, STATUS_REG ; adresa status registru karty VGA
retrace1:
in al, dx ; precist status registr
test al, 8 ; zjistit, zda neprobiha navrat paprsku
jz short retrace1
mov ah,01h ; je klavesa v bufferu ?
int 16h
jz opak ; opakovat do stisku klavesy
xor ah,ah ; cteni klavesy ->vymazani bufferu
int 16h ; klavesnice
mov ax,3 ; nastaveni textoveho rezimu
int 10h
retn ; = DOS EXIT
end start ; finito
3.2 Druhá varianta animace Juliovy množiny
Druhý příklad na animaci Juliovy množiny je vlastně zjednodušenou variantou příkladu předchozího. Není totiž vytvořena barvová paleta, ale využívá se barev z původní barvové palety BIOSu (někdy se říká, že se jedná o původní barevnou paletu VGA, tu však musí nastavovat BIOS, samotná grafická karta nemá ROM s obsahem barvových registrů). V barvových registrech 16–31 se nachází stupně šedi, které jsou v tomto příkladu využity. Po ukončení iterační smyčky je počitadlo iterací podrobeno bitové operaci „or 16“, která zajistí, že výsledná barva se nachází právě v rozsahu 16–31. Ostatní části programu zůstávají zachovány, včetně smyčky provádějící synchronizaci animace s elektronovým paprskem.
Obrázek 3: Screenshot ze třetího demonstračního příkladu; Druhy demonstracni program pro vykresleni animovane Juliovy mnoziny.
; Autor: Pavel Tisnovsky
model tiny ; pametovy model CS=DS=SS<64kB
dosseg
p386 ; povoleny instrukce procesoru 386+ (ale pouze pro dword konstanty)
P equ 65536 ; binarni tecka ve fixed-point formatu
K equ 4*P/128 ; vzdalenost mezi dvema body v rovine (krok smycky)
MIN equ -2*P ; minimalni a maximalni hodnota konstant fraktalu
MAXITER equ 16 ; maximalni pocet iteraci
STATUS_REG equ 3DAh ; stavovy registr karty VGA
p286 ; zpet na sestnactibitovy kod
dataseg
CX_ dd -100000 ; imaginarni konstanta pro iteraci
CY_ dd -80000 ; vse ve fixed point formatu
PCX dd 6000 ; posun realne casti konstanty
udataseg
X db ? ; pozice ve fraktalu
Y db ?
ZX1 dd ? ; komplexni cisla
ZY1 dd ? ; komplexni cisla
ZX2 dd ? ; komplexni cisla
ZY2 dd ? ; komplexni cisla
ZX3 dd ? ; komplexni cisla
ZY3 dd ? ; komplexni cisla
codeseg ; zacatek code-segmentu
org 100h ; zacatek kodu pro programy typu COM
start:
mov al,13h ; VGA graficky rezim 13h
int 10h
mov cl,8
push 0A000h ; do ES adresu video RAM
pop es
p386
opak:
mov di,11520+96 ; aby se fraktal vykreslil
mov bp,52608-320+95
mov eax,CX_ ; doprostred obrazovky
add eax,PCX ; posun konstanty
mov CX_,eax
cmp eax,120000 ; kontrola CX_
jg short up ; CX_ osciluje mezi -100000 a 100000
cmp eax,-120000
jl short up
jmp short pp
up: neg PCX ; posun na opacnou stranu
add CY_,6000 ; posun CY_
cmp CY_,120000 ; kontrola CY_
jl short pp
mov CY_,-80000
pp:
mov ZX1,MIN
mov X,64 ; fraktal bude velikosti 128x128 pixelu
forx:
mov ZY1,MIN
mov Y,128
fory:
mov ch,maxiter ; pocet iteraci
mov eax,ZX1
mov ZX2,eax ; ZX2:=ZX1
mov esi,ZY1
rep_:
mov eax,ZX2
sar eax,cl ; ZX3:=ZX2^2
imul eax
mov ZX3,eax
mov eax,esi
sar eax,cl ; ZY3:=ZY2^2
imul eax
mov ZY3,eax
mov eax,ZX2
sar eax,cl ; ZX2 div 256
sar esi,7 ; ZY2 div 256 * 2
imul esi
add eax,CY_ ; ZY2:=ZX2*ZY2+CY_
mov esi,eax
mov eax,ZX3
sub eax,ZY3
add eax,CX_
mov ZX2,eax ; ZX2:=ZX3^2-ZY3^2+CX_
dec ch ; pocitadlo iteraci
jz short pokrac
mov eax,ZX3
add eax,ZY3
cmp eax,4*P ; kontrola bailout
jc short rep_
pokrac:
mov al,ch ; pocet iteraci
or al,16 ; uprava barvy
stosb ; vykreslit prvni bod
mov es:[bp],al ; vykreslit druhy bod (symetrie)
dec bp
add ZY1,K ; ZY1:=ZY1+K
dec Y ; Y:=Y-1
jnz short fory
add di,320-128 ; dalsi obrazovy radek
sub bp,320-128
add ZX1,K ; ZX1:=ZX1+K
dec X ; X:=X-1
jnz forx
; synchronizace s paprskem monitoru
mov dx, STATUS_REG ; adresa status registru karty VGA
retrace1:
in al, dx ; precist status registr
test al, 8 ; zjistit, zda neprobiha navrat paprsku
jz short retrace1
mov ah,01h ; je klavesa v bufferu ?
int 16h
jz opak ; opakovat do stisku klavesy
xor ah,ah ; cteni klavesy ->vymazani bufferu
int 16h ; klavesnice
mov ax,3 ; nastaveni textoveho rezimu
int 10h
retn ; = DOS EXIT
end start ; finito
4. Intra s tematikou fraktálů
V této kapitole si popíšeme některá intra, ve kterých se zobrazují fraktály. Pro připomenutí: intra jsou velmi krátké programy (z kategorie 128 bytů, 256 bytů, 1kB, 4kB a 64kB), které zobrazují některé zajímavé grafické efekty, jež jsou v některých případech doprovázeny i hudbou. Intra náležející do prvních čtyř kategorií, tj. 128 bytů až 4kB, jsou na počítačích PC většinou určeny pro operační systém MS-DOS a využívají specifických schopností různých grafických a zvukových karet (například omezení na VGA a zvukové karty s OPL2 syntézou či naopak populární GUS). V kategorii 64 kB však již najdeme programy napsané pro systémy Microsoft Windows i Linux, protože do takto velkých souborů se již vejdou i doplňkové informace vyžadované těmito operačními systémy. Některá popisovaná dema a intra můžete získat zde, česká intra pak na adrese uvedené v šesté kapitole.
4.1 Intro „Fractals“
V intru nazvaném jednoduše a přímočaře „Fractals“ se po úvodním scrollu (se zajímavou texturou i paletou) zobrazují animace různě transformovaných Mandelbrotových a Juliových množin. Autorem tohoto intra je Mikko Reinikainen (samozřejmě z Finska) a intro bylo prezentováno na Assembly 94. Pro běh je nutný procesor minimálně 80386 a rychlá grafická karta VGA, ideálně připojená přes Vesa Local Bus nebo sběrnici PCI. Celková velikost programu je rovna 4031 bytům.
Obrázek 4: Intro „Fractals“ Obrázek 5: Intro „Fractals“
4.2 Intro „FracZoom“
I intro nazvané „FracZoom“ pochází z Assembly 94. V podstatě se jedná o jednoduchý program, který nejprve předpočítá animaci zoomu Mandelbrotovy množiny do operační paměti a posléze jednou tuto animaci přehraje. Zajímavé je, že se jedná o program typu EXE (takže obsahuje spoustu zbytečných informací) a jeho celková délka je přesně 4000 bytů. Rozlišení animace je pouhých 120×80 pixelů.
Obrázek 6: Intro „FracZoom“ Obrázek 7: Intro „FracZoom“ Obrázek 8: Intro „FracZoom“
4.3 Intro „Anapurna“
V českém intru nazvaném „Anapurna“, jehož autorem je Dee, se zobrazuje Juliova množina formou výškového pole (height field). Další fraktál je zobrazen na pozadí, nyní již klasickou formou 2D obrázku. Intro má délku pouhých 256 bytů a z VGA palety využívá 64 barev. Oproti předešlým dvěma programům je zde patrný obrovský skok ve schopnostech programátorů zmenšit assemblerovský kód na minimum, i když je pravda, že předchozí dvě intra nepatřila k tomu nejlepšímu, co bylo možné na Assembly 94 vidět.
Obrázek 9: Intro „Anapurna“
4.4 Intro „poledne-dot-com“
Další české intro se jmenuje „poledne-dot-com“ a jeho autory jsou cpoc a Broncs. I toto intro má délku pouhých 256 bytů, používá 32 barev a zobrazuje jednu z variant 3D plasmy. Kód, kterým se výškové pole generuje, sice přímo neodpovídá klasické „fraktálové“ plasmě, to však není vzhledem k relativně malé možnosti výhledu patrné (podobný způsob je využit i u dále popsaného intra Mars).
Obrázek 10: Intro „poledne“
4.5 Intro „mandelbrot is possible“
Toto intro jsme si již popsali v předchozí části seriálu. Připomeňme si, že jde o intro od známého českého autora Dementa, ve kterém se zobrazuje zoom Mandelbrotovy množiny. K tomu ještě hraje hudba, ovšem pouze na kartách s podporou OPL (je možné emulovat). Intro má délku 256 bytů a při vykreslování Mandelbrotovy množiny se nepoužívá zcela korektní test na překročení bailout, podobně jako v dnešním prvním demonstračním příkladu.
Obrázek 11: Intro „mandelbrot is possible“
4.6 Intro „Mars“
Intro „Mars“ je velmi známé a často citované. Po spuštění se zobrazí povrch planety (3D plasma), po kterém se uživatel může pohybovat pomocí myši (interaktivita je pro intra poněkud nezvyklá). Při výpočtu povrchu se používá několik zjednodušení, které se týkají zejména omezených možností pohybu, protože uživatel se může pohybovat pouze dopředu, dozadu, doprava a doleva bez natáčení a náklonu. Počet řezů 3D terénem je relativně malý, ale vzhledem k chytře vyřešené změně výšky kamery v závislosti na výšce povrchu se toto zjednodušení výrazněji neprojevuje.
Obrázek 12: Intro „Mars“
4.7 Intro „Fractia“
Intro nazvané „Fractia“ je naprogramované v kombinaci Pascalu a assembleru, což se dnes může zdát poněkud nezvyklé, ale v minulosti byl Pascal (konkrétně Turbo Pascal) velmi často používaným překladačem, a to i mezi tvůrci dem. V tomto intru se provádí jednoduchá animace morfingu Mandelbrotovy množiny.
Obrázek 13: Intro „Fractia“ Obrázek 14: Intro „Fractia“
4.8 Intro „Palikka“
Intro „Palikka“ od Moottori vzbudilo svého času poměrně velký rozruch. Jednalo se zejména o technické parametry tohoto intra. Je totiž celé naprogramováno tak, že pro grafický výstup používá standardní textový režim grafické karty VGA s šestnácti barvami, ve kterém používá pouze pět znaků (jde o různě vyplněné čtverečky z horních 128 znaků originální znakové sady, v knihovně AA či demu BB se naproti tomu používají ASCII znaky).
Také zvukový doprovod je zajímavý a netradiční – hudba se sice klasicky přehrává přes DA převodníky, ale podobá se spíše „staré“ OPL syntéze; dokonce ani není použitý pro dema typický techno styl. Intro obsahuje standardní demo-efekty (plasma, tunel, 3D terén, zooming, morfing, text-scrolling), které i přes použití textového režimu a standardních 16 barev vypadají velmi zajímavě a přitom „koukatelně“, ovšem z větší dálky. Určitě stojí za to si toto intro i dnes pustit, například přes DOS-Box.
Obrázek 15: Intro „Palikka“ – realtime plasma Obrázek 16: Intro „Palikka“ – efekt známý ze Second Reality
5. Dema obsahující fraktály
Fraktály se vyskytují i v mnoha demech. Známý je například realtime zoomer Mandelbrotovy množiny v multiplatformním demu BB, ve kterém je použit stejný postup založený na motion vektorech, jako v programu XaoS (jak by ne, když autor obou algoritmů je také stejný – Honza Hubička). Ze starších dem je možné jmenovat například Crystal Dream s předpočítaným průletem Mandelbrotovou množinou nebo upoutávku na Assembly 94 se systémy iterovaných funkcí IFS, kterou vytvořili Future Crew v grafickém režimu 640×480 v šestnácti barvách, což je na demo poněkud nestandardní grafický režim.
Pokud budeme mezi fraktály počítat i všechny druhy plasmy, sbírka dem s fraktály se rozšíří o několik set (a možná i několik tisíc) jmen, protože různé efekty plasmy jsou mezi tvůrci dem velmi oblíbené, jelikož jsou snadno implementovatelné a přitom efektní (na druhou stranu už plasmy nejsou tak oblíbené mezi diváky, ti jich většinou mají plné zuby).
6. Odkazy na další informační zdroje
- John Bridges:
VGAKIT Version 5.2b - Matthew Hildebrand:
SVGA library - Jidan Al-Eryani:
Floating Point Unit - Randy Yates:
Fixed-Point Arithmetic: An Introduction - Hook Brian:
An Introduction to Fixed Point Math,
Game Design and Review, 2003 - Agner Fog:
How to optimize for the Pentium processor - Randall Hyde:
The Great Debate: Will Compilers Ever Produce Code as Good as an Expert Assembly Language Programmer?" - Randall Hyde:
The Art of ASSEMBLY LANGUAGE PROGRAMMING - Paul Hsieh:
Programming Optimization - Tomáš Papoušek:
Učebnice assembleru - Peter Norton:
Peter Norton's Assembly Language Book for the IBM PC - TASM FAQ:
http://webster.cs.ucr.edu/Articles/X86FAQ/tasm.html - Software optimization resources:
http://www.agner.org/optimize/ - The PC Game Programmer's Encyclopedia:
http://www.geocities.com/SiliconValley/2151/pcgpe.html - Nasm (Netwide assembler):
http://sourceforge.net/projects/nasm - Intro anapurna:
http://downtown.dee.cz - Intro mandelbrot is possible:
http://downtown.dee.cz - Intro poledne dot com:
http://downtown.dee.cz - QuickMAN – Fast Mandelbrot Generator:
http://sourceforge.net/projects/quickman - A realtime Mandelbrot zoomer in SSE assembly:
http://www.softlab.ntua.gr/~ttsiod/mandelSSE.html - Fractal eXtreme: The Mandelbrot Set:
http://www.cygnus-software.com/gallery/mandelbrot.htm - Assembly Language Programming…:
http://www.magma.ca/~wjr/ - Jeremy Gordon: The Go tools for Windows + Assembler:
http://www.jorgon.freeserve.co.uk/ - sandpile.org: The world's leading source for pure technical IA-32 processor information:
www.sandpile.org - Wikipedia: Fixed-point arithmetic,
http://en.wikipedia.org/wiki/Fixed-point_arithmetic - Wikipedia: Floating point,
http://en.wikipedia.org/wiki/Floating_point - Wikipedia: IEEE floating-point standard,
http://en.wikipedia.org/wiki/IEEE_Floating_Point_Standard - Wikipedia: Assembly language,
http://en.wikipedia.org/wiki/Assembly_language - Wikipedia: List of assemblers,
http://en.wikipedia.org/wiki/List_of_assemblers - Wikipedia: TASM (Turbo Assembler),
http://en.wikipedia.org/wiki/TASM
7. Obsah dalšího pokračování tohoto seriálu
Vzhledem k tomu, že se celý seriál chýlí ke svému konci, bude v následující části provedeno shrnutí všech typů fraktálů, které jsme si popsali v předchozích částech.