DYWANY, CZYLI ZABAWY Z GRAFIKĀ 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. Krzysztof Prusik Def Fn Na poczātek zapoznajmy siė z instrukcjā, która umoūliwia zdefiniowanie wzoru matematycznego i przypisanie go do funkcji. Przykīad: 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 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? Pierwszy proōciutki dywanik 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: 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 **************** Znowu: po co stosowaź tutaj definicjė funkcji >KOLORDef 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 >DegreeDrugi dywanik "z lupkā" 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: Wykresik 3d, czyli dywanik falujācy widziany pod pewnym kātem? Oto listing programu: ' 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_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_POPRZI 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. Jak to dziaīa? 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. Zabawy z dywanem falujācym 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.