home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga MA Magazine 1997 #3
/
amigamamagazinepolishissue03-1
/
ma_1995
/
11
/
ami042.txt
< prev
next >
Wrap
Text File
|
1997-04-07
|
9KB
|
464 lines
DYWANY, CZYLI ZABAWY Z GRAFIKÂ
<lead>AMOS udostëpnia zaawansowane narzëdzia, sîuûâce do zabawy
grafikâ, animacjâ, muzykâ i dúwiëkiem, czym na pewno skîania do
eksperymentowania. Bardzo ciekawe efekty moûna uzyskaê,
wykorzystujâc przeróûne wzory matematyczne do kolorowania
grafik, bëdâcych równieû reprezentacjami wzorów matematycznych.
<a>Krzysztof Prusik
<sr>Def Fn
<txt>Na poczâtek zapoznajmy sië z instrukcjâ, która umoûliwia
zdefiniowanie wzoru matematycznego i przypisanie go do funkcji.
Przykîad:
<l>Degree : Rem --- Jak myôlicie, po co to jest?
Def Fn F(X)=100*Sin(X)
'
For X=0 To Screen Width-1
Plot X,Fn F(X)
Next
<txt>Drugi wiersz programu moûemy rozumieê jako: "definiujë
funkcjë f(x) = 100 Sin(X)". Chyba rozumiemy taki zapis ze
szkolnych lekcji matematyki? W przedostatniej linii programu
wywoîujemy funkcjë rozkazem >Fn F(X)<, co jest równoznaczne z:
"wylicz wartoôê funkcji f, w punkcie x". Proste? Ha! I tyle
zachodu tylko po to, ûeby postawiê kropkë na ekranie?
<sr>Pierwszy proôciutki dywanik
<txt>Wyobraúmy sobie, ûe chcemy pokolorowaê caîy ekran pewnymi
barwami (wartoôê koloru bëdzie zaleûaîa od wspóîrzëdnych X, Y
ekranu). Jak to zrobiê? Na przykîad tak:
<l>Degree : Flash Off
Def Fn KOLOR(X,Y)=Abs(Sin(X)*Cos(Y))*(Screen Colour-1)
'
For X=0 To Screen Width-1
For Y=0 To Screen Height-1
Plot X,Y,Fn KOLOR(X,Y)
Next
Next
********* TU EKRANY 1, 2 i 3 ****************
<txt>Znowu: po co stosowaê tutaj definicjë funkcji >KOLOR<?
Odpowiedú jest prosta: nie po to, ûeby zagmatwaê czytelnoôê
programu, lecz wrëcz przeciwnie, ûeby program staî sië bardziej
przejrzysty, czyli, mówiâc proôciej, dla bajeru.
Dziëki zastosowaniu >Def Fn<, program moûemy wyraúnie podzieliê na
dwie czëôci:
1. Czëôê deklaracyjna (m.in. nasza funkcja)
2. Czëôê wykonywalna (program)
Chcâc uzyskiwaê róûne ciekawe efekty kolorystyczne na ekranie
monitora, modyfikujemy jedynie wzór naszej funkcji, znajdujâcy
sië w 1. Pamiëtajmy jedynie, ûe zdefiniowana przez nas funkcja
musi zwracaê wartoôci z przedziaîu od 0 do >Screen Colour<-1
(zakres palety kolorów).
Oczywiôcie moûemy teû zwiëkszyê rozmiar ekranu (np. >Screen Open
0,640,512,16,Hires+Laced<) oraz wprowadziê efekt rotacji kolorów
(np. >Shift Up 5,1,15,1<). Proponujë teû, za pomocâ rozkazu
>Palette<, ustaliê bardziej sensowne kolory niû standardowe
AMOS-a. Do zastanowienia: co bëdzie, gdy zlikwidujemy na poczâtku
rozkaz >Degree<?
<sr>Drugi dywanik "z lupkâ"
<txt>Zauwaûmy, ûe wzór naszej funkcji jest zawsze wywoîywany dla
wartoôci X z zakresu od 0 do >Screen Width<-1 oraz dla Y z
przedziaîu od 0 do >Screen Height<-1. Zawsze wiëc widzimy ten sam
wycinek kolorowanego przez nas dywanu (patrz rys. 1.).
-------------------!Rys.1: do narysowania przez grafika!-------------------
A gdybyômy dchcieli dostaê do rëki lupë, dziëki której moglibyômy
wybieraê fragment dywanu, jaki chcemy podziwiaê? Trudne? Trzeba
po prostu nauczyê sië "mapowania" (rys. 2.). Technikë të
opisaîem w ksiâûce "AMOS Professional w praktyce -- programowaê
moûe kaûdy" (K. Prusik, Z. Sypniewski, wydawnictwo RaWi sc.)
przy okazji tworzenia programu rysujâcego wykres.
--------------------!Rys.2: do narysowania przez grafika!--------------------
A propos, moûe utworzymy:
<sr>Wykresik 3d, czyli dywanik falujâcy
<txt>widziany pod pewnym kâtem? Oto listing programu:
<l>' Wykres_3d (C) 1995 Krzysztof Prusik
'
'********** DEKLARACJE **********
'
' wzór naszej pîaszczyzny
'
Def Fn F#(X#,Y#)=Sin(Sqr(X#*X#+Y#*Y#)*Pi#)
'
' maks. i min. wartoôê funkcji
'
F_MIN#=-5
F_MAX#=5
'
' lupka, czyli którâ czëôê pîaszczyzny
' widzimy na ekranie
'
X1#=-5 : Y1#=-5
X2#=5 : Y2#=5
'
' rozmiar x i y wykresu
'
X_MAX=310 : Y_MAX=310
'
' przesuniëcie wykresu
'
X_WSP=20 : Y_WSP=70
'
' kolory wykresu
'
KOLOR_ROSNIE=2
KOLOR_MALEJE=3
'
'********** INICJALIZACJA **********
'
' otwieramy ekran 640x512x4
'
Screen Open 0,640,512,4,Hires+Laced
Palette 0,$F,$F00,$FF0
Flash Off : Curs Off : Cls 0
'
' tablica Góra i Dóî
'
Dim _DOL(Screen Width)
Dim _GORA(Screen Width)
'
' inicjalizujemy tablicë wartoôciami
' zbyt duûymi/maîymi
'
For I=1 To Screen Width
_DOL(I)=-20000
_GORA(I)=20000
Next
'
' obliczamy kroki
'
X_KROK#=(X2#-X1#)/X_MAX
Y_KROK#=(Y2#-Y1#)/Y_MAX
'
' obliczamy WSPOLCZYNNIK#
'
WSPOLCZYNNIK#=Y_MAX/(F_MAX#-F_MIN#)
'
'********** PROGRAM **********
'
Y#=Y1#
For J=1 To Y_MAX
X#=X1#
For I=1 To X_MAX
'
' podstawiamy f(x,y), za f
' ûeby liczyê tylko raz
'
F#= Fn F#(X#,Y#)
If F#<F_MIN#
'
' wyszliômy poza zakres, wiëc:
'
F#=F_MIN#
End If
If F#>F_MAX#
'
' wyszliômy poza zakres, wiëc:
'
F#=F_MAX#
End If
'
' obliczamy pozycjë punktu na ekranie
'
X_EKRAN=X_WSP+I+J
Y_EKRAN=Y_WSP+J+WSPOLCZYNNIK#*F#
' odwrócenie wykresu, bo oô OY odwrócona
Y_EKRAN=Screen Height-Y_EKRAN
'
' wpisujemy do tablicy Góra i Dóî
'
If Y_EKRAN>_DOL(X_EKRAN)
_DOL(X_EKRAN)=Y_EKRAN
End If
If Y_EKRAN<_GORA(X_EKRAN)
_GORA(X_EKRAN)=Y_EKRAN
End If
If Y_EKRAN>=_DOL(X_EKRAN) or Y_EKRAN<=_GORA(X_EKRAN)
'
' rysujemy linië
'
If I<>1
If Y_EKRAN_POPRZ<Y_EKRAN
'
' funkcja roônie, wiëc:
'
Ink KOLOR_ROSNIE
Else
'
' funkcja maleje, wiëc:
'
Ink KOLOR_MALEJE
End If
Draw X_EKRAN_POPRZ,Y_EKRAN_POPRZ To X_EKRAN,Y_EKRAN
End If
End If
'
' poprzednia pozycja punktu na ekranie
'
X_EKRAN_POPRZ=X_EKRAN
Y_EKRAN_POPRZ=Y_EKRAN
'
' nastëpny X# do obliczeï
'
X#=X#+X_KROK#
Next
'
' nastëpny Y# do obliczeï
'
Y#=Y#+Y_KROK#
Next
Wait Key
Default
Edit : Rem --- powrót do edytora
<txt>I to wszystko. Powyûszy program umoûliwia rysowanie
dowolnych wykresów trójwymiarowych w prespektywie, z eliminacjâ
zasîoniëtych linii i bocznym oôwietleniem, na ekranach monitorów,
podîâczonych do naszych Amig.
<sr>Jak to dziaîa?
<txt>Zasada tworzenia wykresu jest bardzo prosta. Otóû w kaûdym
obrocie pëtli >For J=1 To Y_MAX< kreôlimy jeden "poziomy" pasek
funkcji (za kaûdym razem przesuwamy go o 1 w górë i w prawo,
dziëki czemu otrzymujemy zîudzenie trójwymiarowoôci). Jeôli
f(x,y) roônie, wtedy czëôê paska rysujemy kolorem >KOLOR_ROSNIE<,
w przeciwnym razie uûywamy >KOLOR_MALEJE<, co powoduje zîudzenie
cienia.
Eliminacja zasîoniëtych linii? Po prostu dla kaûdego punktu
ekranowego pamiëtamy górnâ >_GORA()< i dolnâ >_DOL()< czëôê
wykresu i rysujemy tylko wtedy, gdy czëôê paska znajduje sië
"nad" lub "pod" wykresem.
<sr>Zabawy z dywanem falujâcym
<txt>Proponujë na razie nie modyfikowaê zasadniczego tekstu
programu, a jedynie pogrzebaê troszkë w deklaracjach. Oczywiôcie
najciekawsze efekty uzyskamy, definiujâc róûne wzory funkcji
(>Def Fn<) oraz manipulujâc przedziaîami wartoôci X (>X1,X2<) i Y
(>Y1,Y2<), dla których kreôlimy funkcjë, dziëki czemu moûemy
wybraê oglâdany przez nas fragment wykresu (coô na podobieïstwo
lupy (rys. 3.).
-------------------!Rys.3!------------------------------
No, a teraz najciekawsza rzecz. Oto ciekawe, wedîug mnie, wzory
funkcji, które warto obejrzeê:
f(x,y)=sin(x)+cos(y)
f(x,y)=sin(x)*cos(y)
f(x,y)=(sin(x)-cos(y))^3
f(x,y)=sin(8x)+exp(x)
f(x,y)=(exp(x)+exp(-x))/2+log(y+sqr(y^2+1))
f(x,y)=sin(x-y)+sqr(abs(xy))
f(x,y)=7(sin(x/5)+cos(y))
f(x,y)=3(atan(x)+atan(y))
f(x,y)=x^2+y^2
f(x,y)=x^2-y^2
Gdy juû sië zaczniemy bawiê wzorami, po pewnym czasie dojdziemy
do takiej perfekcji, ûe skîadajâc poszczególne funkcje ze sobâ,
bëdziemy w stanie tworzyê prawie dowolne kompozycje graficzne,
czego z caîego serca wszystkim ûyczë. Jeûeli ktoô wpadnie na
"genialny wzór", w wyniku którego na ekranie pojawi sië "Orzeî
Biaîy w Koronie", proszë go przysîaê do redakcji.
************ TU EKRANY 4, 5 i 6 ********************
No i na zakoïczenie maîa uwaga: przed uruchomieniem kaûdego
nowego programu tworzâcego dywanik proponujë go przedtem
skompilowaê poleceniem >Compile< z menu >User< (patrz artykuî "Co
to jest AMOS?"). Za pierwszym razem AMOS skopiuje sobie do
pamiëci RAM odpowiednie pliki (co trochë potrwa), ale za to kaûda
nastëpna kompilacja bëdzie trwaîa "sekundë" (oczywiôcie jeûeli
mamy duûo pamiëci), a kaûdy skompilowany program bëdzie "chodziî"
jak rakieta.