back  main  up  next This site can be viewed at all resolutions
Last update:
31-10-2004 03:19:19

ADVANCED VISUALIZATION STUDIO - PRAKTYCZNE ZASTOSOWANIA.
Wykonywanie wykresów funkcji rzeczywistych.

Chyba każdy użytkownik cyberjednostki, spotkał się chociaż raz, z programem Winamp grupy Nullsoft. Niejeden spotyka się z nim dosyć często, a zapewne istnieje dość znaczna grupa użytkowników, którzy używają tego programu codziennie, czyniąc go niemal niepomijalnym procesem, od którego działania uzależnione jest prawidłowe funkcjonowanie użytkownika. Ten najpopularniejszy odtwarzacz plików muzycznych, jest rozwijany od tak dawna, że stał się niemalże standardem, obrazem ideału, prawidłem i wykładnią tego, jak winien wyglądać i funkcjonować odtwarzacz. "Obrósł" również w znaczną ilość przeróżnych plugin-ów, poszerzających jego możliwości.

Jednym z owych plugin-ów jest system wizualizacji Advanced Visualization Studio. System ten generalnie służy temu, aby zobrazować odtwarzany dźwięk animacjami, których zmiany są od owego dźwięku zależne.
Posiada on jednak kilka elementów, które dają nam dosyć ciekawe możliwości.

Dla użytkowników, którzy nie wiedzą "o co chodzi" wyjaśnię, że AVS należy zainstalować razem z Winamp-em, a nastepnie wybrać w opcjach (CTRL+P i Plugins/Visualization) i uaktywnić ów plugin zaznaczając go po prostu w okienku Visualization Plugins. Następnie należy uruchomić plugin, klikając przycisk oznaczony napisem "Start". Pojawi się okienko wizualizacji, a w nim, oczywiście, wizualizacja.

Następnie, wyjaśnić pragnę zainteresowanym Użytkownikom, że po wywołaniu menu kontekstowego prawym kliknięciem na oknie wizualizacji uzyskujemy dostęp do Menu, z którego wybrać możemy opcję "Dock in config". Użytkownikom posiadającym Winamp-a i plugin-y z opisami w języku innym niż angielski podpowiem, że pozycja ta jest druga, licząc od góry menu.

Wybranie omawianej opcji owocuje otwarciem okna "Winamp AVS Editor".
Właśnie o wykorzystaniu tego potężnego narzędzia traktuje poniższa praca.

Celem projektu jest przystosowanie AVS, do wyświetlania wykresów zadanych funkcji matematycznych.
AVS posiada wbudowane narzędzie do graficznej interpretacji funkcji matematycznych, które po zapoznaniu się z jego działaniem można swobodnie wykorzystać. Zaznaczam, że poniższe wskazówki zostały napisane po niespełna dwugodzinnym kontakcie autora z systemem AVS, zawierają więc tylko i wyłącznie niebędne informacje, potrzebne przy dostosowywaniu AVS do wyświetlania wykresów funkcji.

  1. Wybierając z menu Preset\New tworzymy nowy projekt.
    Uzyskujemy z lewej drzewo elementów wizualizacji, zawierające jedynie element "main".
  2. Wybieramy element "main" z drzewa po lewej i po prawej zaznaczamy jego jedyną opcję - "clear every frame"
    Opcja ta powoduje, że przed narysowaniem nowej klatki wizualizacji, klatka poprzednia zostanie wymazana.
  3. Wciskając przycisk oznaczony plusem "+", rozwijamy menu, z którego wybieramy "Render\Superscope"
    W drzewie po lewej pojawia się element "Render / Superscope", po lewej na dole, okno z wirującą spiralą, a po prawej kilka pól zawierających wzory. Owe pola, jak i wzory wewnątrz są istotą i esencją poniższego projektu.
    Kilka słów o nich:
    - Pole "Init" zawiera operacje, wykonywane podczas startu wizualizacji, operacje te są wykonywane tylko raz, tuż po uruchomieniu.
    - Pole "On Beat" zawiera operacje wykonywane po wykryciu tzw. "Beatu" czyli nagłej zmiany fali dźwiękowej.
    - Pole "Per Frame" zawiera operacje wykonywane jeden raz, przed narysowaniem nowej ramki. [klatki]
    - Pole "Per Point" zawiera operacje wykonywane dla każdego punktu, co to znaczy, wyjaśni się za moment.
  4. Zawartość owych pól jest interpretowana przez kompilator, który interpretując wzory, mogące zawierać stałe, zmienne i symbole operacji matematycznych, a także funkcje [patrz pkt. 7.] oblicza ich końcowe wartości i przekazuje do "renderera" - programu, który w zależności od zawartości owych zmiennych rysuje w odpowiednim miejscu okna wizualizacji punkt.
  5. Wbudowany w AVS renderer posiada następujące "wewnętrzne" zmienne:
    - n = liczba punktów. Dla wizji ma znaczenie, tylko jeśli na dole po prawej wybierzemy "draw as: Dots". Poza tym operacje z ramki "Per point" wykonywane będą n razy, przy rysowaniu jednej klatki.
    - b = wynosi 1, jeśli wykryto Beat, w przeciwnym razie jest równa 0.
    - v = zmienia się w zależnośći od kształtu fali dźwiękowej, lub widma jej częstotliwości (zależy to od opcji "Source Data: Waveform | Spectrum"), przyjmuje wartości rzeczywiste od -1 do 1 [wyłącznie].
    - x = współrzędna x, rysowanego punktu.
    - y = współrzędna y, rysowanego punktu.
    Powyższe dwie są dosyć ważne, gdyż to one, dla każdego spośród n punktów określają jego bieżące położenie, mogą przybierać wartości rzeczywiste między -1, a 1 [wyłącznie].
    - i = zmienna, możnaby rzec "parsująca". Jej wartość zmienia się od 0 do 1, w czasie rysowania każdej klatki. Wielkość "skoku" jes określana przez ilość punktów i wynosi 1/n.
  6. Można określić własne zmienne, które mogą przyjmować wartości rzeczywiste.
  7. Użycie przycisku "Expression Help" pozwoli nam zapoznać się z wbudowanymi funkcjami, takimi jak sinus, wartość bezwzględna, czy potęgowanie.
  8. Aby narysować próbną linię wyczyśćmy wszystkie pola, i wpiszmy w pole "init" formułę "n=10" (oczywiście bez cudzysłowów), a w pole "Per point" formuły: "y=0", oraz "x=i" oddzielone średnikiem ";".
    Wartość zerowa zmiennej y spowoduje, że linia będzie rysowana na osi x, a przypisanie zmiennej x wartości zmiennej i spowoduje, że przy rysowaniu jednej klatki, zmiennej x będą przypisywane kolejne wartości zmiennej parsującej i, a więc zmienna x przybierze wszystkie wartości 1/a dla a zmieniającego się od 1 do n.
    Pamiętać należy, że zmienne x i y mogą przyjmować jedynie wartości pomiędzy -1,a 1, inaczej wyświetlany punkt znajdzie się poza oknem wyświetlania i nie zobaczymy go.
    W oknie wizualizacji powinna ukazać się pozioma linia złożona z 10 kropek. Niestety widzimy tylko dziewięć, ponieważ kropka o współrzędnych (1,0) znajduje się już poza oknem.
  9. Spróbujmy "zagęścić" naszą linię zwiększając wartość początkową zmiennej n np. do 100. Zaczyna ona wyglądać jak linia. Jeśli chcemy ją nieco przesunąć, by zobaczyć jej koniec, zmieńmy formułę "x=i" na "x=i-0.1", widzimy że linia przesuneła się w lewo.
    Jeśli spróbujemy zmienić wartość zmiennej y z 0 na np 0.5 zauważymy, że linia przesunęła się w dół, zamiast w górę. Jest to spowodowane tym, że ze względów historycznych w grafice komputerowej przyjmuje się, iż oś 0Y jest skierowana w dół, nie zaś w górę, jak uczono na lekcjach matematyki.
  10. Reasumując: dysponujemy systemem, w którym, mamy zmienną parsującą i, biegnącą od 0 do 1, w n krokach, oraz mamy zmienne x i y, ustalające współrzędne rysowanego punktu, na płaszczyźnie w której współrzędne zamykają się w zakresie (-1,1) , przy czym oś y jest skierowana w dół. Aby więc dostosować nasz system do celów edukacyjnych skierujemy oś y w górę, wpisując jako ostatnią formulę w polu "Per point" "y=-y". Funkcja ta odpowiada symetrii względem osi 0X. Jeśli teraz wpiszemy pomiędzy formułami "x=i-0.1" a "y=-y", w miejsce formuły przypisującej wartość zmiennej y, wyrażenie "y=x" uzyskamy wykres funkcji "y=x".
    zawartość pola "Per point" winna wyglądać następująco: "x=i-0.1;y=x;y=-y".
  11. Mamy więc możliwość wyświetlania serii punktów, o podanych współrzednych, przy czym możemy uzależnić współrzedną y od wartości współrzednej x, co daje nam zdolność kreślenia wykresów funkcji. Aby w pełni wykorzystać tę możliwość należy spowodować, by wartość zmiennej x zmieniała się w zakresie większym, niż (0,1).
    - Aby zmienna x mogła przyjmować wartości dodatnie jak i ujemne, należy skonstruować funkcję F prowadzącą ze zbioru (0,1) [i] do zbioru (-z,z) [x] gdzie z będzie zadaną szerokością zakresu. Funkcja ta miałaby mieć następujące własności: F(0)=-z, F(1)=z, F(0.5)=0. Nietrudno zauważyć, że własności te spełnia funkcja F(i)=(i-0.5)*2*z.
    Dla ustalenia uwagi wybierzmy zakres z=1, tak więc w polu "Per point" zapiszemy na początku wzór: x=(i-0.5)*2*1, nie zapominając oczywiście, o średnikach rozdzielających formuły. Zawartośc pola "Per point" wygląda tak: "x=(i-0.5)*2*1;y=x;y=-y", przy czym w polu "Init" mamy "n=100".
    W oknie wizualizacji widzimy teraz linię zaczynającą się w lewym dolnym rogu, biegnącą w kierunku prawego górnego rogu. Aby sprawdzić, jak działa nasz system dla innych funkcji, wpiszmy teraz zamiast "y=x", formułę "y=x*x", w oknie wizualizacji ukazuje się parabola, a właściwie jej część, mieszcząca się w zakresie xe(-1,1) ye(-1,1). Aby zmienić skalę, należy podstawić inną wartość zmiennej z. Wygodnie byłoby nasz wzór sparametryzować, wpisując x=(i-0.5)*2*z, w polu "Per point", a w polu Init dodając formułę "z=1". Teraz zamiast zmieniać wzór, zmieniamy jedynie podstawienie w polu "Init". Zmieniając z na 10, widzimy, że kształt paraboli nie uległ zmianie, zmieniła się natomiast jej gęstość - poszerzyliśmy zakres występowania zmiennej x, jednak nie poszerzyliśmy zakresu wyświetlanie, który nadal jest "zamknięty" na oknie (-1,1)x(-1,1).
    - Aby zwiększyć zakres wyświetlania należy przed przekazaniem zadania wyświetlenia wykresu podzielić wszystkie współrzędne x i y przez zadaną skalę. Dla przykładu, jeśli podzielimy x i y przez 2, wtedy w oknie wyświetlania zobaczymy "ixy" i "ygreki" leżące między -2, a 2. Tę operację proponuję również sparametryzować. Tak więc w polu "Init" definiujemy dwie zmienne "x_scale=2;y_scale=2", a w polu "Per point" wpisujemy na końcu "x=x/x_scale;y=y/y_scale".
    Widzimy teraz nieco większą część paraboli. Pewnym utrudnieniem jest brak skali i podziałki, gdyż nie możemy określić jaką część wykresu obserwujemy.
  12. Aby wyświetlić osie układu współrzędnych utwórzmy w drzewie projektu, po lewej stronie kolejny element renderujący, używając przycisku plus "+" i wybierając Render\SuperScope.
    Wyczyśćmy wszystkie pola, po czym zapiszmy:
    - w polu "Init" "n=100"
    - w polu "Per point" "y=0;x=i"
    Mamy oś 0X, na odcinku od 0 do 1. Aby mieć ją na całej szerokości, wpierw przesuńmy ją w lewo wpisując zamiast "x=i" formułę "x=i-0.5", a następnie podwójmy jej długość zamieniając "x=i-0.5" na "x=2*(i-0.5)", w polu "Per point" mamy "y=0;x=2*(i-0.5)" a w oknie wizualizacji oś 0X na całej szerokości okna.
    -Aby wyświetlić drugą oś, sklonujmy element, w którym stworzyliśmy oś 0X, zaznaczając go i wciskając przycisk "x2", następnie w polu "Per point" zamieńmy x i y miejscami. Otrzymujemy w polu "Per point": "x=0;y=2*(i-0.5)", a na wykresie pionową oś 0Y.
  13. Brakuje nam jeszcze oznaczenia jednostki, które pomogłoby określić jaką część wykresu oglądamy. Wykonamy je, rysując krótkie linie, w miejscach gdzie osie 0X i 0Y mają ową umowną "jednostkę".
    Muszę zaznaczyć, że skala wykresu zależy od zmiennych x_scale i y_scale, określonych w elemencie rysującym wykres. Niestety zmienne te widoczne są jedynie, na obszarze tego elementu i nie możemy, w innym elemencie wykorzystać ich wartości, dlatego trzeba będzie przepisać je ręcznie, do elementów odpowiadających, za wyświetlanie znaczników jednostek.
    - Tworzymy nowy element Render\SuperScope, czyścimy jego pola, wpisujemy w pole "Init" "n=10;x_scale=2" [musimy zadbać, aby wartość x_scale była taka sama, jak w elemencie rysującym wykres], w polu "Per point" wpisujemy formuły: "y=i;x=1/x_scale". W oknie wizualizacji widzimy nową linię, biegnącą w połowie prawej cześci osi 0X, w dół, do krawędzi okna. Linia ta onzacza jednostkę osi 0X w skali x_scale. skracamy ją, modyfikując formułę "y=i" na "y=i/10", można też nieco przesunąć ją do góry przez odjęcie od wartości y niewielkiej liczby, np: "y=(i/10)-0.05", tak więc pole "Per point" wygląda następujaco:"y=(i/10)-0.05;x=(1/x_scale)". Aby wykonać podobną jednostkę na osi 0Y, klonujemy element z jednostką [przycisk x2], i zamieniamy miejscami x i y. Widzimy, że jednostka narysowała się pod osią 0X zamiast nad nią, więc do wartości wpisywanej w y dodajemy minus. Pole "Per point" wygląda tak:"x=(i/10)-0.05;y=-(1/x_scale)".
  14. By wpuścić do naszego projektu nieco estetyki, mozemy teraz wybrać dla poszczególnych elementów wykresu kolor, klikając w każdym elemencie białą ramkę z prawej na dole.
  15. Aby móc badać ciekawe funkcje możemy zwiększyć skalę do 10, [x_scale=10 i y_scale=10 w elemencie z wykresem oraz w elementach z jednostkami], zaś liczbę punktów wykresu do 1000 [n=1000, w polu Init elementu z wykresem].
  16. Jeśli chcemy, by nasz wykres tańczył do muzyki, wystarczy jako ostatnią instrukcję w "Per point" wpisać "y=y+v"
  17. Zachęcam czytelników do samodzielnego eksperymentowania z tym, jakże potężnym systemem, można np. dorobić strzałki do osi współrzędnych :)
  18. Plik z gotowym systemem do rysowania wykresów można ściągnąć tutaj: graph.avs [458 B]
    Należy go umieścić w katalogu Winamp\Plugins\avs, a następnie po kliknięciu prawym przyciskiem myszy na oknie wizualizacji AVS, wybrać pozycje "graph"
  19. Oto screen, ukazujący, że powyższe dywagacje mają jakiś sens: parabola.jpg [27918 B]

Powyższy projekt został zasponsorowany przez następujące podmioty:
- Producent Herbaty "Eternal" - napoju Bogów Nocy.
- Producent Cukru "Polski Cukier, Biały Kryształ" - cukru tychże.
- Producent Kuloodpornej Czarki Do Herbaty - jak wyżej.
- Producent Czajnika Bezprzewodowego [do pewnego stopnia] firmy Clatronic.
- Nasturcja [to chyba jej czajnik jest].
- Grupa Nullsoft - Producent Winamp-a i AVS
- Analiza Matematyczna 2, a w szczególności Grupa Funkcji Nieciągłych, Asymptoty Ukośne, oraz granice na krańcach określoności.
- Grupa BruteForce/Informatyka Stosowana/UJ
- Korporacja Arena.
- sEwer/Arena [sewer (at) z.pl]

Information wants to be free.

Powyższy projekt jest wolny. Skopiuj go.


©opy®ight 2003 by sEwer

Encoding ISO 8859-2 [ąćęłńóśźż]