Iz opazovanja marmorja lahko povem, da jih je veliko vrst. Poznamo marmor
Sliko zajamemo na presecni ravnini kvadra. Ravnina je popisana s tocko [XYZ], to je koordinato centra ekrana, ter z normalnim vektorjem ravnine. Le ta je dolocen s kotom [j] med projekcijo normale na ravnino XY in osjo X ter s kotom [J] med ravnino XY (oz. projekcijo normale) ter normalnim vektorjem (horizontalni kot normale ravnine ter elevacijski kot normale ravnine). Poleg tega s povecevalnim parametrom [Zoom] dolocimo ogljisca ekrana.
Zajem slike poteka za vsak piksel ekrana posebej. Skeniramo vrstice od vrha proti dnu in piksle od leve proti desni. Koordinate vsakega piksla [ij] posebej preracunamo v koordinate marmornega sistema [xyz] po formuli:
I = (i-320) J = (j-240)
x = X + (sin(j)*I + sin(J)*J* cos(j))*Zoom/320
y = Y - (cos(j)*I - sin(J)*J* sin(j))*Zoom/320
z = Z - (cos(J)*J)*Zoom/320
Stevilke 320 in 240 veljajo za graficni nacin 640x480.
Ko se dolocijo koordinate posameznega piksla, se poisce barva le tega. Paleta barv marmorja se nahaja linearno razporejena med RGB tockama [00 00 00] in [FF FF FF] hex. Robni barvi sem dolocil vizualno ob primerjavi marmorja. (Velja za paleto StonPal0.COL) Glede na to, da najnatancnejsi graficni nacini delujejo v RGB direktnem nacinu 8:8:8, se da v RGB prostoru koordinatne osi R,G in B razdeliti na najvec 256 delov. Ce v to RGB kocko postavimo daljico, bo ta daljica imela svojo dolzino glede na koordinatne osi Dr Dg in Db. Le v redkih primerih bo katera od dolzin Dr Dg Db dolga 256 enot. Palete cistih barv rdece, zelene, modre, rumene, turkizne, violicne ter sive bodo imele eno dve ali vse tri stranice dolge 256 enot. V nasem primeru pa je razpon Dr Dg Db [+255 +255 +255] dec. Ker je koordinatni sistem RGB celostevilcen sledi, da nam lahko daljica priskrbi le toliko razlicnih barv, kot je dolga njena najdaljsa diferenca plus ena, v nasem primeru je to 256 barv. Zapis slike, katere paleta se nahaja le na daljici, s komponentami RGB bi bil zato potraten iz razlogov velikosti, kompresibilnosti ter hitrosti izrisovanja. Zato sem se odlocil za graficni nacin z 256 fiksnimi barvami 640x480x256.
Barva posameznega piksla se torej doloci glede na njegove koordinate [xyz]. Preverjamo oddaljenost centra vseh elipsoidov od koordinat piksla. Glede na oddaljenost in jakost elipsoid (aditivno) prispeva vrednost, glede na vsoto katerih se na koncu doloci barva (0 = nevtralna barva, 1 = barva elipsoida).
r2 = ((x-Stone.DotX[u])/View.RX)2 + ((y-Stone.DotY[u])/View.RY)2 + ((z-Stone.DotZ[u])/View.RZ)2
P = (P + e-0.001 * Stone.DotF[u] * r10)
kjer so parametri RX, RY in RZ deformacije krogle v elipsoid.
Poleg tega moramo generirati se vpliv razdrobitve na kamencke. Le ti naj bi bili veliki cca. 1 cm. Uporabil sem pristop iz mehanike fluidov. Tri-dimenzionalno polje tock, je polje izvorov. Glede na koordinate piksla dolocimo 25 sosednjih izvorov. Glede na to, da so si izvori 10 mm narazen, lahko z njimi sestavimo le kocko s stranico 1280 mm, v prvem oktantu koordinatnega sistema z ohljiscem v izhodiscu. Za vsa morebitna preverjanja izven te kocke, se koordinate preracunavajo po modulu 128. 25 sosednjih izvorov ima torej vsak svojo zacetno hitrost. Glede na oddaljenost piksla od izvora se izracunajo tri komponente hitrosti na koordinatah piksla, celotna hitrost pa je
dv = (Stone.P[a][b][c] * e-0.125* r4)
Modificirana absolutna hitrost v preiskovani tocki nam posvetli barvo tocke, tocke na nicelni tokovnici pa ne spreminjajo ozadja.
Program deluje v okolju DOS in potrebuje en vhodni parameter:
000.500 000.500 000.500
000.000 000.000 000.214
StonPal0.COL
000.100 000.100 000.010
220 100 191
Pri zaganjanju programa le ta zapisuje mozne probleme v datoteko TREE.ERR. Med tekom programa se da spreminjati parametre ravnine:
Poliranje : Enter
Ko je slika spolirana, jo shranimo v nekompresiran format TarGA 640x480x256 pod vpisano ime. Vse shranjene slike bodo nosile inkrementirane indekse. Shranjevanje : F10
Kot receno traja poliranje eno minuto. Medtem, ko procesor opravlja idealni loop in preverja tipke, lahko izstopimo v DOS po regularni poti. Ta pot ne bo delovala med preracunavanjem. Normalni izhod : ESC
Ce iz katerega koli razloga program obvisi ali ne zelimo cakati konca izracuna, lahko prisilno izstopimo v DOS pod pogojem, da ni prislo do napake med klicanjem interrupta tipkovnice. Prisilni izhod : Ctrl-Alt-Del
Zgradba:
Velikost Stevilo Opis
Reference:
- Borland Turbo Assembler 3.0 Quick Reference Guide
- PCGPE (PC Game Programmer`s Encyclopedia)