home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga ACS 1997 #2
/
amigaacscoverdisc
/
amigascene
/
diskmagazines
/
izviestia
/
izviestia_10
/
texts
/
035
/
035
Wrap
Text File
|
1996-08-12
|
6KB
|
136 lines
B Emboss
[Leo/Fire]
Kiedyô w Magazynie Amiga w cyklu "Jak ulepszyê procedurë" autorstwa
Miklesza ukazaî sië artykuî jak zrobiê embossa w realtime. Przerobiîem
procedurkë na AMOSa i uruchomiîem (juû nie byî realtime). Wynik dziaîania
procedury nie podobaî mi sië, poniewaû w odróûnieniu od innych procedur
liczâcych emobssa na tym obrazku nie daîo sië zauwaûyê "gîëbi" obrazu i kolory
byîy pomieszane (tam, gdzie powinien byê jasny odcieï byî ciemny i na odwrót).
Pomyôlaîem, ûe paleta w rysunku byîa odwrócona, ale gdy przyjrzaîem sië
obrazkowi w gazecie doszedîem do wniosku, ûe tak powinno byê. Nie próbujë
tutaj poniûyê procedury Miklesza gdyû wyliczenie odpowiedniego odcienia na
podstawie jednego koloru byîo rozwiâzane w bardzo sprytny sposób.
Moja procedurka do liczenia embossa powstaîa przed ukazaniem sië Magazynu
Amiga z artykuîem Miklesza. Dlatego proszë, aby nikt nie pomyôlaî, ûe
procedurë "zerûnâîem". Najpierw napisaîem procedurkë, która embossuje tylko
szare rysunki i to w dodatku gdzie paleta kolorów jest odpowiednio ustawiona
(w assemblerze pewnie byîby realtime emboss). Potem postanowiîem napisaê
procedurkë, która embossuje kolorowe rysunki.
Przechodzë do konkretów. W mojej procedurze emboss jest liczony na
podstawie dwóch punktów, dziëki czemu moûna uzyskaê emboss low lub emboss
high. Mój pomysî polega na tym ûe:
- pobieram wartoôê koloru z pozycji (x,y), zapisujë np.w zmiennej kol
- pobieram wartoôê koloru z pozycji (x+2,y+2), zapisujë w zmiennej kol1
(emboss low)
- robië negatyw koloru kol1
- potem róûnicë kol i kol1 dzielë na dwa (otrzymujë 50% przezroczystoôê)
- odejmujë róûnicë (kol-kol1)/2 od kol
I w ten sposób otrzymujë odpowiedni kolor. Sposób ten jest niezîy tylko
wtedy, gdy rysunek jest w odcieniach szaroôci, a paleta jest ustawiona w
kolejnoôci od czarnego do biaîego lub na odwrót. Procedura ta najlepiej
"wypali" gdy paleta bëdzie 16 kolorów, i gdy kolory nie bëdâ sië powtarzaê. W
tej procedurze problem negatywu obszedîem jak mi sië wydaje w ciekawy sposób.
Mianowicie od iloôci kolorów odjâîem numer koloru pobranego z punktu (x+2,
y+2)
Od razu napiszë odpowiedniâ procedurë w AMOSIE (najproôciej zrozumieê).
__cut_here__
Load Iff "nazwa",1
For y=0 To Screen Heigh
For x=0 To Screen Width
kol=Point(x,y)
kol1=16-Point(x+2,y+2) : rem jeôli chcesz emboss low x+4, y+4 lub 3
ok=kol-(kol-kol1)/2
Plot x,y,ok
Next
Next
__cut_here__
W assemblerze gîówna procedura liczâca teû jest krótka, ale to juû sami
napiszcie.
Aby uzyskaê embossa w kolorze procedura bëdzie musiaîa sprowadziê wszystkie
kolory do odpowiednich odcieni szaroôci. Robië to przez wyrównanie wszystkich
skîadowych koloru do najwiëkszej skîadowej. W ten sposób moûna zmieniê paletë
kolorów, jeôli nie chcecie zmieniaê kolorów, to moûna teû zastosowaê
nastëpujâcy sposób:
1. Wyszukujecie w kolorze najwiëkszâ skîadowâ.
2. Szukacie wartoôci potrzebnej do negatywu poprzez odjëcie od 16 (w
przypadku braku koôci AGA) wartoôci z punktu 1 (niech ta wartoôê to x)
3. Jeûeli na wartoôci z punktu 2 wykonacie nastëpujâcâ operacjë: X*256+X*16+X
to otrzymacie wartoôê negatywu.
4. Teraz wystarczy tylko, jeûeli z palety kolorów wyszukacie najbliûszâ
wartoôê koloru z punktu 3
5. Teraz pozostaje tylko wstawiê punkt
Jeûeli kolory z palety sprowadzicie do odcieni szaroôci, wtedy uzyskacie w
miarë dokîadnego embossa, w przeciwnym wypadku moûe to róûnie wyglâdaê. Aby
Was pocieszyê Drodzy Czytelnicy opiszë pewnâ historië z mych prób z
embossowaniem. Kiedy napisaîem procedurë (po kilku przemyôleniach) wîâczyîem
rysunek do obróbki, poczâtkowo kolory rysunku byîy sprowadzane do odcieni
szaroôci, wtedy z wyniku byîem bardzo zadowolony (byî coolowski), ale kiedy
rysunek byî obrabiany bez zmiany kolorów efekt wyszedî caîkowicie do d.
Zaczâîem sië ostro zastanawiaê co poprzekrëcaîem, ale nigdzie nie widziaîem
bîëdu. Z ciekawoôci chciaîem zobaczyê jak wyglâda ten sam rysunek pod PPaintem
po procesie embossowania, i to co zobaczyîem bardzo mnie zadowoliîo,
mianowicie emboss z PPaint'a wyglâdaî prawie identycznie jak mój.
Pocieszajâce, no nie?
Oto procedura:
__cut_here__
Dim KOL(31)
For I=0 To 31
'A=Colour(I) * Te obliczenia
'B=A/256 * sâ po to aby
'C=(A-B*256)/16 * rysunek byî
'D=A-B*256-C*16 * w odcieniach
'NA=Max(B,C) * szaroôci.
'NA=Max(NA,D) * (niekonieczne
'KOL=Abs(NA-B)*256+B*256+Abs(NA-C)*16+C*16+Abs(NA-D)+D * ale lepszy
'Colour I,KOL * emboss)
KOL(I)=KOL
Next
__cut_here__
Teraz o pewnej wadzie tego algorytmu. Kiedy liczenie emboss'a zakoïczy sië
okaûe sië, ûe dwie lub trzy linie na prawej krawëdzi rysunku i na samym dole
sâ niedokîadnie wyliczone. Kaûdy juû powinien wiedzieê dlaczego. {no
rzeczywiôcie - KAÛDY. Kurcze, nie mówië, ûeby podawaê kawë na îawë, ale takie
"sami wiecie", "rozumiecie", "pomyôlcie se trochë" jest bezdenne. "Patrz
Czytelniku jaki jesteô gîâb - autor wie, a Ty nie": to popularne podejôcie
wielu tekôciarzy-programistów /korekta}{a wiëc wyjaôniam - chodzi o to "+2"
(czy tam ile) w obliczaniu poszczególnych wartoôci - dla "krawëdzi ekranu"
punkty zwiëkszone o 2 sâ poza nim i sâ to w sumie wartoôci "z nieba"
(konkretnie to chyba bëdzie zero - tak mi sië zdaje ;). Teraz zadowoleni?
/LeMUr}
Jeûeli ktoô jest zainteresowany tematem grafiki, to dajcie znaê mnie albo
redakcji. W miarë mych moûliwoôci bëdë sië staraî speîniaê Wasze ûyczenia.
LEO/Fire
{Wiëc dobrze - ja, lamer nieprzeciëtny, jestem zainteresowany tematem grafiki
(i nie tylko). Dlatego teû uprzejmie proszë o obszerniejsze objaônienia
nastëpnâ razâ /korekta}