home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1997 #3 / amigamamagazinepolishissue03-1 / ma_1995 / 11 / ami042.txt < prev    next >
Text File  |  1997-04-07  |  9KB  |  464 lines

  1.  
  2. DYWANY, CZYLI ZABAWY Z GRAFIKÂ
  3.  
  4. <lead>AMOS udostëpnia zaawansowane narzëdzia, sîuûâce do zabawy
  5. grafikâ, animacjâ, muzykâ i dúwiëkiem, czym na pewno skîania do
  6. eksperymentowania. Bardzo ciekawe efekty moûna uzyskaê,
  7. wykorzystujâc przeróûne wzory matematyczne do kolorowania
  8. grafik, bëdâcych równieû reprezentacjami wzorów matematycznych.
  9.  
  10. <a>Krzysztof Prusik
  11.  
  12. <sr>Def Fn
  13.  
  14. <txt>Na poczâtek zapoznajmy sië z instrukcjâ, która umoûliwia
  15. zdefiniowanie wzoru matematycznego i przypisanie go do funkcji.
  16. Przykîad:
  17.  
  18. <l>Degree : Rem --- Jak myôlicie, po co to jest?
  19.  
  20. Def Fn F(X)=100*Sin(X)
  21.  
  22. '
  23.  
  24. For X=0 To Screen Width-1
  25.  
  26.     Plot X,Fn F(X)
  27.  
  28. Next
  29.  
  30.  
  31. <txt>Drugi wiersz programu moûemy rozumieê jako: "definiujë
  32. funkcjë f(x) = 100 Sin(X)". Chyba rozumiemy taki zapis ze
  33. szkolnych lekcji matematyki? W przedostatniej linii programu
  34. wywoîujemy funkcjë rozkazem >Fn F(X)<, co jest równoznaczne z:
  35. "wylicz wartoôê funkcji f, w punkcie x". Proste? Ha! I tyle
  36. zachodu tylko po to, ûeby postawiê kropkë na ekranie?
  37.  
  38.  
  39. <sr>Pierwszy proôciutki dywanik
  40.  
  41. <txt>Wyobraúmy sobie, ûe chcemy pokolorowaê caîy ekran pewnymi
  42. barwami (wartoôê koloru bëdzie zaleûaîa od wspóîrzëdnych X, Y
  43. ekranu). Jak to zrobiê? Na przykîad tak:
  44.  
  45. <l>Degree : Flash Off
  46.  
  47. Def Fn KOLOR(X,Y)=Abs(Sin(X)*Cos(Y))*(Screen Colour-1)
  48.  
  49. '
  50.  
  51. For X=0 To Screen Width-1
  52.  
  53.     For Y=0 To Screen Height-1
  54.  
  55.         Plot X,Y,Fn KOLOR(X,Y)
  56.  
  57.     Next
  58.  
  59. Next
  60.  
  61. ********* TU EKRANY 1, 2 i 3 ****************
  62.  
  63. <txt>Znowu: po co stosowaê tutaj definicjë funkcji >KOLOR<?
  64. Odpowiedú jest prosta: nie po to, ûeby zagmatwaê czytelnoôê
  65. programu, lecz wrëcz przeciwnie, ûeby program staî sië bardziej
  66. przejrzysty, czyli, mówiâc proôciej, dla bajeru.
  67.  
  68. Dziëki zastosowaniu >Def Fn<, program moûemy wyraúnie podzieliê na
  69. dwie czëôci:
  70.  
  71. 1. Czëôê deklaracyjna (m.in. nasza funkcja)
  72.  
  73. 2. Czëôê wykonywalna (program)
  74.  
  75. Chcâc uzyskiwaê róûne ciekawe efekty kolorystyczne na ekranie
  76. monitora, modyfikujemy jedynie wzór naszej funkcji, znajdujâcy
  77. sië w 1. Pamiëtajmy jedynie, ûe zdefiniowana przez nas funkcja
  78. musi zwracaê wartoôci z przedziaîu od 0 do >Screen Colour<-1
  79. (zakres palety kolorów).
  80.  
  81. Oczywiôcie moûemy teû zwiëkszyê rozmiar ekranu (np. >Screen Open
  82. 0,640,512,16,Hires+Laced<) oraz wprowadziê efekt rotacji kolorów
  83. (np. >Shift Up 5,1,15,1<). Proponujë teû, za pomocâ rozkazu
  84. >Palette<, ustaliê bardziej sensowne kolory niû standardowe
  85. AMOS-a. Do zastanowienia: co bëdzie, gdy zlikwidujemy na poczâtku
  86. rozkaz >Degree<?
  87.  
  88.  
  89. <sr>Drugi dywanik "z lupkâ"
  90.  
  91. <txt>Zauwaûmy, ûe wzór naszej funkcji jest zawsze wywoîywany dla
  92. wartoôci X z zakresu od 0 do >Screen Width<-1 oraz dla Y z
  93. przedziaîu od 0 do >Screen Height<-1. Zawsze wiëc widzimy ten sam
  94. wycinek kolorowanego przez nas dywanu (patrz rys. 1.).
  95.  
  96. -------------------!Rys.1: do narysowania przez grafika!-------------------
  97.  
  98. A gdybyômy dchcieli dostaê do rëki lupë, dziëki której moglibyômy
  99. wybieraê fragment dywanu, jaki chcemy podziwiaê? Trudne? Trzeba
  100. po prostu nauczyê sië "mapowania" (rys. 2.). Technikë të
  101. opisaîem w ksiâûce "AMOS Professional w praktyce -- programowaê
  102. moûe kaûdy" (K. Prusik, Z. Sypniewski, wydawnictwo RaWi sc.)
  103. przy okazji tworzenia programu rysujâcego wykres.
  104.  
  105. --------------------!Rys.2: do narysowania przez grafika!--------------------
  106.  
  107. A propos, moûe utworzymy:
  108.  
  109. <sr>Wykresik 3d, czyli dywanik falujâcy
  110.  
  111. <txt>widziany pod pewnym kâtem? Oto listing programu:
  112.  
  113. <l>' Wykres_3d (C) 1995 Krzysztof Prusik
  114.  
  115. '
  116.  
  117. '********** DEKLARACJE **********
  118.  
  119. '
  120.  
  121. ' wzór naszej pîaszczyzny
  122.  
  123. '
  124.  
  125. Def Fn F#(X#,Y#)=Sin(Sqr(X#*X#+Y#*Y#)*Pi#)
  126.  
  127. '
  128.  
  129. ' maks. i min. wartoôê funkcji
  130.  
  131. '
  132.  
  133. F_MIN#=-5
  134.  
  135. F_MAX#=5
  136.  
  137. '
  138.  
  139. ' lupka, czyli którâ czëôê pîaszczyzny
  140.  
  141. ' widzimy na ekranie
  142.  
  143. '
  144.  
  145. X1#=-5 : Y1#=-5
  146.  
  147. X2#=5 : Y2#=5
  148.  
  149. '
  150.  
  151. ' rozmiar x i y wykresu
  152.  
  153. '
  154.  
  155. X_MAX=310 : Y_MAX=310
  156.  
  157. '
  158.  
  159. ' przesuniëcie wykresu
  160.  
  161. '
  162.  
  163. X_WSP=20 : Y_WSP=70
  164.  
  165. '
  166.  
  167. ' kolory wykresu
  168.  
  169. '
  170.  
  171. KOLOR_ROSNIE=2
  172.  
  173. KOLOR_MALEJE=3
  174.  
  175. '
  176.  
  177. '********** INICJALIZACJA **********
  178.  
  179. '
  180.  
  181. ' otwieramy ekran 640x512x4
  182.  
  183. '
  184.  
  185. Screen Open 0,640,512,4,Hires+Laced
  186.  
  187. Palette 0,$F,$F00,$FF0
  188.  
  189. Flash Off : Curs Off : Cls 0
  190.  
  191. '
  192.  
  193. ' tablica Góra i Dóî
  194.  
  195. '
  196.  
  197. Dim _DOL(Screen Width)
  198.  
  199. Dim _GORA(Screen Width)
  200.  
  201. '
  202.  
  203. ' inicjalizujemy tablicë wartoôciami
  204.  
  205. ' zbyt duûymi/maîymi
  206.  
  207. '
  208.  
  209. For I=1 To Screen Width
  210.  
  211.    _DOL(I)=-20000
  212.  
  213.    _GORA(I)=20000
  214.  
  215. Next
  216.  
  217. '
  218.  
  219. ' obliczamy kroki
  220.  
  221. '
  222.  
  223. X_KROK#=(X2#-X1#)/X_MAX
  224.  
  225. Y_KROK#=(Y2#-Y1#)/Y_MAX
  226.  
  227. '
  228.  
  229. ' obliczamy WSPOLCZYNNIK#
  230.  
  231. '
  232.  
  233. WSPOLCZYNNIK#=Y_MAX/(F_MAX#-F_MIN#)
  234.  
  235. '
  236.  
  237. '********** PROGRAM **********
  238.  
  239. '
  240.  
  241. Y#=Y1#
  242.  
  243. For J=1 To Y_MAX
  244.  
  245.    X#=X1#
  246.  
  247.    For I=1 To X_MAX
  248.  
  249.       '
  250.  
  251.       ' podstawiamy f(x,y), za f
  252.  
  253.       ' ûeby liczyê tylko raz
  254.  
  255.       '
  256.  
  257.       F#= Fn F#(X#,Y#)
  258.  
  259.       If F#<F_MIN#
  260.  
  261.          '
  262.  
  263.          ' wyszliômy poza zakres, wiëc:
  264.  
  265.          '
  266.  
  267.          F#=F_MIN#
  268.  
  269.       End If
  270.  
  271.       If F#>F_MAX#
  272.  
  273.          '
  274.  
  275.          ' wyszliômy poza zakres, wiëc:
  276.  
  277.          '
  278.  
  279.          F#=F_MAX#
  280.  
  281.       End If
  282.  
  283.       '
  284.  
  285.       ' obliczamy pozycjë punktu na ekranie
  286.  
  287.       '
  288.  
  289.       X_EKRAN=X_WSP+I+J
  290.  
  291.       Y_EKRAN=Y_WSP+J+WSPOLCZYNNIK#*F#
  292.  
  293.       ' odwrócenie wykresu, bo oô OY odwrócona
  294.  
  295.       Y_EKRAN=Screen Height-Y_EKRAN
  296.  
  297.       '
  298.  
  299.       ' wpisujemy do tablicy Góra i Dóî
  300.  
  301.       '
  302.  
  303.       If Y_EKRAN>_DOL(X_EKRAN)
  304.  
  305.          _DOL(X_EKRAN)=Y_EKRAN
  306.  
  307.       End If
  308.  
  309.       If Y_EKRAN<_GORA(X_EKRAN)
  310.  
  311.          _GORA(X_EKRAN)=Y_EKRAN
  312.  
  313.       End If
  314.  
  315.       If Y_EKRAN>=_DOL(X_EKRAN) or Y_EKRAN<=_GORA(X_EKRAN)
  316.  
  317.          '
  318.  
  319.          ' rysujemy linië
  320.  
  321.          '
  322.  
  323.          If I<>1
  324.  
  325.             If Y_EKRAN_POPRZ<Y_EKRAN
  326.  
  327.                '
  328.  
  329.                ' funkcja roônie, wiëc:
  330.  
  331.                '
  332.  
  333.                Ink KOLOR_ROSNIE
  334.  
  335.             Else
  336.  
  337.                '
  338.  
  339.                ' funkcja maleje, wiëc:
  340.  
  341.                '
  342.  
  343.                Ink KOLOR_MALEJE
  344.  
  345.             End If
  346.  
  347.             Draw X_EKRAN_POPRZ,Y_EKRAN_POPRZ To X_EKRAN,Y_EKRAN
  348.  
  349.          End If
  350.  
  351.       End If
  352.  
  353.       '
  354.  
  355.       ' poprzednia pozycja punktu na ekranie
  356.  
  357.       '
  358.  
  359.       X_EKRAN_POPRZ=X_EKRAN
  360.  
  361.       Y_EKRAN_POPRZ=Y_EKRAN
  362.  
  363.       '
  364.  
  365.       ' nastëpny X# do obliczeï
  366.  
  367.       '
  368.  
  369.       X#=X#+X_KROK#
  370.  
  371.    Next
  372.  
  373.    '
  374.  
  375.    ' nastëpny Y# do obliczeï
  376.  
  377.    '
  378.  
  379.    Y#=Y#+Y_KROK#
  380.  
  381. Next
  382.  
  383. Wait Key
  384.  
  385. Default
  386.  
  387. Edit : Rem --- powrót do edytora
  388.  
  389.  
  390. <txt>I to wszystko. Powyûszy program umoûliwia rysowanie
  391. dowolnych wykresów trójwymiarowych w prespektywie, z eliminacjâ
  392. zasîoniëtych linii i bocznym oôwietleniem, na ekranach monitorów,
  393. podîâczonych do naszych Amig.
  394.  
  395. <sr>Jak to dziaîa?
  396.  
  397. <txt>Zasada tworzenia wykresu jest bardzo prosta. Otóû w kaûdym
  398. obrocie pëtli >For J=1 To Y_MAX< kreôlimy jeden "poziomy" pasek
  399. funkcji (za kaûdym razem przesuwamy go o 1 w górë i w prawo,
  400. dziëki czemu otrzymujemy zîudzenie trójwymiarowoôci). Jeôli
  401. f(x,y) roônie, wtedy czëôê paska rysujemy kolorem >KOLOR_ROSNIE<,
  402. w przeciwnym razie uûywamy >KOLOR_MALEJE<, co powoduje zîudzenie
  403. cienia.
  404.  
  405. Eliminacja zasîoniëtych linii? Po prostu dla kaûdego punktu
  406. ekranowego pamiëtamy górnâ >_GORA()< i dolnâ >_DOL()< czëôê
  407. wykresu i rysujemy tylko wtedy, gdy czëôê paska znajduje sië
  408. "nad" lub "pod" wykresem.
  409.  
  410. <sr>Zabawy z dywanem falujâcym
  411.  
  412. <txt>Proponujë na razie nie modyfikowaê zasadniczego tekstu
  413. programu, a jedynie pogrzebaê troszkë w deklaracjach. Oczywiôcie
  414. najciekawsze efekty uzyskamy, definiujâc róûne wzory funkcji
  415. (>Def Fn<) oraz manipulujâc przedziaîami wartoôci X (>X1,X2<) i Y
  416. (>Y1,Y2<), dla których kreôlimy funkcjë, dziëki czemu moûemy
  417. wybraê oglâdany przez nas fragment wykresu (coô na podobieïstwo
  418. lupy (rys. 3.).
  419.  
  420. -------------------!Rys.3!------------------------------
  421.  
  422.  
  423. No, a teraz najciekawsza rzecz. Oto ciekawe, wedîug mnie, wzory
  424. funkcji, które warto obejrzeê:
  425.  
  426. f(x,y)=sin(x)+cos(y)
  427.  
  428. f(x,y)=sin(x)*cos(y)
  429.  
  430. f(x,y)=(sin(x)-cos(y))^3
  431.  
  432. f(x,y)=sin(8x)+exp(x)
  433.  
  434. f(x,y)=(exp(x)+exp(-x))/2+log(y+sqr(y^2+1))
  435.  
  436. f(x,y)=sin(x-y)+sqr(abs(xy))
  437.  
  438. f(x,y)=7(sin(x/5)+cos(y))
  439.  
  440. f(x,y)=3(atan(x)+atan(y))
  441.  
  442. f(x,y)=x^2+y^2
  443.  
  444. f(x,y)=x^2-y^2
  445.  
  446.  
  447. Gdy juû sië zaczniemy bawiê wzorami, po pewnym czasie dojdziemy
  448. do takiej perfekcji, ûe skîadajâc poszczególne funkcje ze sobâ,
  449. bëdziemy w stanie tworzyê prawie dowolne kompozycje graficzne,
  450. czego z caîego serca wszystkim ûyczë. Jeûeli ktoô wpadnie na
  451. "genialny wzór", w wyniku którego na ekranie pojawi sië "Orzeî
  452. Biaîy w Koronie", proszë go przysîaê do redakcji.
  453.  
  454. ************ TU EKRANY 4, 5 i 6 ********************
  455.  
  456. No i na zakoïczenie maîa uwaga: przed uruchomieniem kaûdego
  457. nowego programu tworzâcego dywanik proponujë go przedtem
  458. skompilowaê poleceniem >Compile< z menu >User< (patrz artykuî "Co
  459. to jest AMOS?"). Za pierwszym razem AMOS skopiuje sobie do
  460. pamiëci RAM odpowiednie pliki (co trochë potrwa), ale za to kaûda
  461. nastëpna kompilacja bëdzie trwaîa "sekundë" (oczywiôcie jeûeli
  462. mamy duûo pamiëci), a kaûdy skompilowany program bëdzie "chodziî"
  463. jak rakieta.
  464.