Hlavní navigace

Fraktály naprogramované v assembleru II

17. 4. 2007
Doba čtení: 18 minut

Sdílet

V dnešním článku dokončíme popis naprogramování fraktálů pomocí krátkých aplikací napsaných v assembleru. Ukážeme si jednoduchý program pro vykreslení Juliovy množiny a také programy pro vytváření animací těchto množin. Dále si řekneme, ve kterých demech a intrech jsou fraktály použity a některá z těchto dem a inter si přiblížíme.

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.

fractals76_1
Obrázek 1: Screenshot prvního demonstračního příkladu

Tento 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).

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

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

fractals76_4
Obrázek 4: Intro „Fractals“

fractals76_5
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ů.

fractals76_6
Obrázek 6: Intro „FracZoom“

fractals76_7
Obrázek 7: Intro „FracZoom“

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

fractals76_9
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).

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

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

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

fractals76_d
Obrázek 13: Intro „Fractia“

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

fractals76_f
Obrázek 15: Intro „Palikka“ – realtime plasma

fractals76_g
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).

CS24 tip temata

6. Odkazy na další informační zdroje

  1. John Bridges:
    VGAKIT Version 5.2b
  2. Matthew Hildebrand:
    SVGA library
  3. Jidan Al-Eryani:
    Floating Point Unit
  4. Randy Yates:
    Fixed-Point Arithmetic: An Introduction
  5. Hook Brian:
    An Introduction to Fixed Point Math,
    Game Design and Review, 2003
  6. Agner Fog:
    How to optimize for the Pentium processor
  7. Randall Hyde:
    The Great Debate: Will Compilers Ever Produce Code as Good as an Expert Assembly Language Programmer?"
  8. Randall Hyde:
    The Art of ASSEMBLY LANGUAGE PROGRAMMING
  9. Paul Hsieh:
    Programming Optimization
  10. Tomáš Papoušek:
    Učebnice assembleru
  11. Peter Norton:
    Peter Norton's Assembly Language Book for the IBM PC
  12. TASM FAQ:
    http://webster­.cs.ucr.edu/Ar­ticles/X86FAQ/­tasm.html
  13. Software optimization resources:
    http://www.ag­ner.org/optimi­ze/
  14. The PC Game Programmer's En­cyclopedia:
    http://www.ge­ocities.com/Si­liconValley/2151/pcgpe­.html
  15. Nasm (Netwide assembler):
    http://source­forge.net/pro­jects/nasm
  16. Intro anapurna:
    http://downtow­n.dee.cz
  17. Intro mandelbrot is possible:
    http://downtow­n.dee.cz
  18. Intro poledne dot com:
    http://downtow­n.dee.cz
  19. QuickMAN – Fast Mandelbrot Generator:
    http://source­forge.net/pro­jects/quickman
  20. A realtime Mandelbrot zoomer in SSE assembly:
    http://www.sof­tlab.ntua.gr/~ttsi­od/mandelSSE.html
  21. Fractal eXtreme: The Mandelbrot Set:
    http://www.cygnus-software.com/ga­llery/mandelbrot­.htm
  22. Assembly Language Programming…:
    http://www.mag­ma.ca/~wjr/
  23. Jeremy Gordon: The Go tools for Windows + Assembler:
    http://www.jor­gon.freeserve­.co.uk/
  24. sandpile.org: The world's leading source for pure technical IA-32 processor information:
    www.sandpile.org
  25. Wikipedia: Fixed-point arithmetic,
    http://en.wiki­pedia.org/wiki/Fi­xed-point_arithmetic
  26. Wikipedia: Floating point,
    http://en.wiki­pedia.org/wiki/Flo­ating_point
  27. Wikipedia: IEEE floating-point standard,
    http://en.wiki­pedia.org/wiki/I­EEE_Floating_Po­int_Standard
  28. Wikipedia: Assembly language,
    http://en.wiki­pedia.org/wiki/As­sembly_langua­ge
  29. Wikipedia: List of assemblers,
    http://en.wiki­pedia.org/wiki/Lis­t_of_assemblers
  30. Wikipedia: TASM (Turbo Assembler),
    http://en.wiki­pedia.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.

ikonka

Zajímá vás toto téma? Chcete se o něm dozvědět víc?

Objednejte si upozornění na nově vydané články do vašeho mailu. Žádný článek vám tak neuteče.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.