ビズン

AMOS i obliczenia. cz 1.

Dopisek "cz.1." w tytule jest bardzo mylący: oczywiście nigdy żadne dalsze części nie powstały. Teraz uczą tego w szkole podstawowej:) Gdy pozbieram wszystkie inne programy w Amosie, spróbuję przepisać je w Javie i zamieścić wraz z opisem w osobnym artykule.

--== WRÓĆ ==--

Niniejszym artykułem chciałbym zacząć krótki cykl poświęcony tematowi obliczeń matematycznych za pomocą AMOSa1.
Dowiemy się na przykład jak wygenerować wykres powierzchni funkcyjnej, jak skalować grafikę, jak dokonywać rzutu perspektywicznego, oraz - co pewnie zainteresuje ludzi piszących gry -- jak obliczać elementy ruchu i trajektorie ciał w polu grawitacyjnym; zarówno jednorodnym (jak w "Scorched Earth") jak i też centralnym ("Frontier").

Zakładam, że czytający ten artykuł mają już jakieś doświadczenia z AMOSem i z programowaniem w ogóle.

* * *

Zacznijmy może jednak od początku:
Ponieważ efekty naszej pracy będziemy oglądać na ekranie monitora, proponuję zająć się teraz skalowaniem grafiki.

Spróbujmy narysować wykres funkcji sinus; użyjemy rozdzielczości 640*512 i dwu kolorów. Chcemy, aby wykres zawierał się w okienku, którego lewy górny róg ma współrzędne (10,30), a prawy dolny (630,400) oraz aby program rysował dwie gałęzie wykresu tej funkcji (dziedzina= <-2*Pi#,2*Pi#> ). Mamy więc dwa obszary: Jeden to obszar funkcji - szerokość od -2*Pi# do 2*Pi# i wysokość od -1 do 1; drugi natomiast to okienko ekranowe:

               XB1#= -2*Pi#             XB2#= 10
               XE1#= 2*Pi#              XE2#= 630
               YB1#= -1                 YB1#= 30
               YE1#= 1                  YE2#= 400

Gdzie:
XB1# i XE1# ----> granice dziedziny funkcji,
YB1# i YE1# ----> granice zbioru wartości funkcji,
XB2# Do YE2# ---> brzegi okienka ekranowego.

Należy teraz znaleźć takie wzpółczynniki A# B# C# D#, aby brzegi jednego obszaru przeszły w brzegi drugiego, a więc aby spełnione były zależności:

                         A#*XB1#+B#=XB2#
                         A#*XE1#+B#=XE2#
                         C#*YB1#+D#=YB2#
                         C#*YE1#+D#=YE2#

Traktując powyższe zależności jak układ równań otrzymujemy wartości współczynników skalowania:

     A#=(XE2#-XB2#)/(XE1#-XB1)
     B#=XB2#-A#*XB1
     C#=(YE2#-YB2#)/(YE1#-YB1)
     E#=YB2#-C#*YB1

Mając więc obliczone ze wzoru Y#=Fn A(X#) liczby X# i Y#, aby postawić punkt na właściwym miejscu mnależy wykonać:

                     Plot A#*X#+B#,C#*Y#+D#

Tym, którzy chcą zobaczyć jak to działa w praktyce, proponuję przeanalizowanie tekstu poniższego programu.

     Screen Open 0,640,512,2,-1
     Flash Off : Palette 0,$F0
     Cls 0 : Curs Off : Ink 1
     'wzór:
     Def Fn A(X#)=Sin(X#)
     'obszar X:
     XB1#=-2*Pi#
     XE1#=2*Pi#
     'obszar Y:
     YB1#=1
     YE1#=-1
     'okienko ekranowe:
     XB2#=10
     XE2#=630
     YB2#=60
     YE2#=410
     'krok kwantowania:
     KX#=0.0078125
     'współczynniki skalowania:
     Box XB2#,YB2# To XE2#,YE2#
     A#=(XB2#-XE2#)/(XB1#-XE1#)
     B#=XB2#-A#*XB1#
     C#=(YB2#-YE2#)/(YB1#-YE1#)
     D#=YB2#-C#*YB1#
     '*** PĘTLA GŁÓWNA ***
     For X#=XB1# To XE1# Step KX#
        Y#= Fn A(X#)
        U=A#*X#+B#
        V=C#*Y#+D#
        Plot U,V
         Print At(1,1);U,V
     Next
     Wait Key
     Edit

I to wszystko na dzisiaj. Zainteresowanych głębiej tym problemem odsyłam do literatury:
[1] - czas. 'ENTER'; lipiec '93, "Mikroprofesor - krzemowy przestwór";
[2] - Ruedger Bauman: "Grafika komputerowa"; WKŁ 1989.

Jako 'zadanie domowe' spróbujcie zastanowić się nad następującymi problemami:
  1. Sporządzić wykresy funkcji:
         Fn A(X#)= Sin(X#)+Sin(X#)
         Fn A(X#)= Sin(X#)+Sin(X#*X#)
         Fn A(X#)= Sin(X#*10)*Exp(-X#)
         Fn A(X#)= 0.5*(Sin(20*X#)+Sin(21*X#))
  2. Uzupełnić program o procedurę rysującą podziałkę w formie siatki. Podziałka nie powinna zmniejszać czytelności wykresu, oraz powinna odzwierciedlać realne zależności liczbowe - jedynka na osi X nie musi być zawsze równa jedynce na osi Y, ale wartość funkcji sin(Pi#) powinna być równa 0! (Może być wskazane otwarcie ekranu w więcej niż dwu kolorach.)
  3. W przykładowym programie obraliśmy dziedzinę funkcji i krok będący wartością liczbową, następnie szukaliśmy odpowiedników X# i Y# na ekranie. Zastanówcie się nad działaniem odwrotnym: niech program przeszukuje wszystkie punkty U okienka ekranowego, później znajduje ich odpowiedniki w dziedzinie funkcji i dopiero wtedy oblicza odpowiadające im V.
  4. Napisać program rysujący krzywe Lissajous, z wykorzystaniem algorytmu skalowania. Ogólne równanie parametryczne tych krzywych ma postać:
         dla Z# należącego do przedziału <-2*Pi#,2*Pi#>
                  / X#=Sin(M#*Z#)
                  \ Y#=Cos(N#*Z#+Faza#)
W następnym odcinku zajmiemy się przekształceniem perspektywicznym oraz przestrzennymi wykresami powierzchni funkcyjnych. Czekam na Wasze pytania i pomysły na ciekawe programy. Mój adres znajdziecie w ogłoszeniach.

(c)1995
Iego Ferromagnetyczność


1AMOS: Napisana w 1989r. przez François Lionett'a udana amigowa wersja kompletnie nieudanego STOS z AtariST. Bardzo prosty w opanowaniu dialekt języka Basic, wyposażony w elementy strukturalne i namiastkę obiektowych. Więcej tutaj i tutaj.



--== WRÓĆ ==--