Wykresy4DX9 - Interaktywna, trójwymiarowa wizualizacja wykresów funkcji wielu zmiennych.

1. Cele projektu
Aplikacja Wykresy4DX9 jest przede wszystkim narzędziem matematycznym do interaktywnej wizualizacji wykresów podawanych przez użytkownika funkcji: 2- i 3- zmiennych. Wykreślane wykresy są w przestrzeniach trój- lub czterowymiarowych (4D oznacza animację wykresu 3D zmieniającego się w czasie).
Funkcje mogą być podawane w postaci parametrycznej i zawierać zmienną reprezentującą czas - dla możliwości utworzenia animacji.
Zaimplementowany parser wyrażeń arytmetycznych umożliwia obliczanie dowolnie zdefiniowanych przez użytkownika funkcji wielu zmiennych.
Aplikację wykorzystać także można jako swego rodzaju narzędzie do modelowania grafiki 3D, gdyż umożliwia operowanie wieloma wykresami jednocześnie, dzięki temu możliwe jest budowanie scen 3D z wprowadzanych funkcji i danych.
Wykreślanie wykresów jest generowane w czasie rzeczywistym z możliwością INTERAKTYWNEGO OGLĄDANIA trójwymiarowej sceny z każdej pozycji i pod dowolnym kątem, tzn. z możliwością "poruszania się" w generowanej przestrzeni 3D.
Program generuje SZYBKĄ I PŁYNNĄ ANIMACJĘ prezentowanych wykresów oraz dużą wygodę oglądania ich, tzn. operując np. myszką można dowolnie poruszać się w przestrzeni, aby oglądać dany wykres lub animację ze wszystkich stron.
Ponadto program generuje dowolnie DUŻĄ PRZESTRZEŃ wykresu wykraczającą poza wielkość ekranu monitora.
Interaktywność przejawia się w następujących bezpośrednich operacjach na generowanych obiektach:
- zmiana zakresów zmiennych (u,v)
- zmiana wartości zmiennej reprezentującej czas (t)
- obracanie, translacja i skalowanie wykresów
- obracanie i translacja kamery
- obracanie sześcianu sceny
- translacja światła
- zmiana rodzaju wizualizacji, sposobu renderowania
- zmiana pozycji płaszczyzny tnącej (obcinającej) wykresy
Przy generowaniu grafiki zastosowane są takie techniki renderowania, jak: uwzględnienie padającego światła, różne cieniowania, odbicia, teksturowanie, mapowanie środowiskowe itp. - wszystko po to, aby wykres wyglądał bardzo REALISTYCZNIE.
Program umożliwia różne metody wizualizacji, renderowania generowanych wykresów:
- wykresy w formie punktów, siatek, ścianek;
- możliwość zmian cieniowania ścianek: płaskie, gourauda
- zmiana kolorów materiałów ścianek wykresów
- zmiana kolorowania wierzchołków: względem wysokości na osi X, Y lub Z (efekt mapy)
- teksturowanie zwykłe (z filtrowaniem bilinearnym)
- teksturowanie mapujące środowisko (efekt metalicznego materiału)
- efekt przezroczystości ścianek
Aplikacja zawiera wiele innych funkcjonalności oraz cechuje ją duża szybkość działania.

2. Słownik
Parser - implementacja przetwarzania wyrażeń arytmetycznych - program, który umożliwia obliczanie wartości z pobieranych w formie tekstu, dowolnie zdefiniowanych przez użytkownika funkcji o dowolnej liczbie zmiennych z wykorzystaniem wbudowanych funkcji jak np. +, /, sin, sqrt
Rwanie się obrazu - brak płynności podczas wyświetlania zmieniającej się grafiki; brak dobrej synchronizacji generowanych animacji scen 3D z interakcją użytkownika.
Interaktywny - charakteryzujący się natychmiastową zmianą wyglądu, postaci; reagujący natychmiast (bezpośrednio) na polecenia użytkownika.
Kamera - punkt i kierunek obserwacji obiektów.


3. Użyte technologie i algorytmy
- algorytm sprawdzania gramatyki wyrażeń arytmetycznych
- algorytm translacji wyrażeń do Odwrotnej Notacji Polskiej z moimi rozszerzeniami
- technologia generowania grafiki 3D - DirectX ["Direct3D Biblia"- Julio Sanchez, Maria Canton; "Aplikacje Direct 3D 8.1" - Robert Krupiński; www.directx.w.interia.pl]

4. Schemat składowych systemu
Komponenty wchodzące w skład aplikacji:
- Główny program z interfejsem użytkownika - Wykresy4DX9.exe.
- Parser wyrażeń arytmetycznych - w postaci ładowanej statycznie biblioteki satorparserv.DLL.
- Plik tekstowy z tekstami i ustawieniami funkcji 'Funkcje.txt'
- Zbiór tekstur w plikach .bmp
- Plik pomocy Wykresy4DX9.hlp

Zapewnienie płynnej animacji i nie "rwania" się obrazu podczas interaktywnych operacji na wykresach o dużej gęstości siatki punktów i animacji liczonych w czasie rzeczywistym wymagało jak największego zoptymalizowania kodu programu i parsera, dlatego całość (program i parser) została napisana w języku C++ i przy bezpośrednich odwołaniach do funkcji WinApi (tzn. bez korzystania z bibliotek MFC czy OWL)
Implementacja oparta jest o technologię DirectX Microsoft'u w wersji 9.0b, która umożliwia pełne wykorzystanie sprzętowych funkcji współczesnych kart/akceleratorów graficznych.

* Wymagania środowiskowe
System operacyjny Win32 z zainstalowanymi bibliotekami DirectX w wersji 9.0b lub nowszej.

* Wymagania sprzętowe
Komputer z procesorem minimum około 200 MHz, karta graficzna ze wspomaganiem bibliotek DirectX dla pełnej płynności grafiki.
Najlepiej używać programu w trybie True Color

Klasa obliczająca wartości wyrażeń arytmetycznych zawierających zdefiniowane przez użytkownika zmienne (tzw. parser).
Podstawowym problemem przy generowaniu wykresów jest umożliwienie obliczenie wartości funkcji podanych przez użytkownika w formie tekstu oraz sprawdzenie dziedzin tych funkcji, tzn.
obsłużenie sytuacji, gdy zmienne nie należą do dziedziny podanej funkcji.
Problem ten został rozwiązany i zaimplementowany w osobnej klasie, która została skompilowana do postaci biblioteki DLL; Postać klasy umożliwia łatwe użycie jej w innych dowolnych programach.
Możliwości tej klasy - parsera:
- umożliwia pobieranie dowolnie zdefiniowanych przez użytkownika funkcji
- możliwość definiowania funkcji o dowolnej liczbie zmiennych
- pozwala na własne definiowanie nazw zmiennych
- sprawdza poprawność tekstów podawanych wyrażeń i zmiennych
- sprawdza poprawność podanego wyrażenia tzn. syntaksy i gramatyki
- sprawdza wszelkie dziedziny funkcji podczas obliczania wartości wyrażenia (np. dzielenie przez zero, za duża wartość argumentu dla silni)
- zawiera rozbudowany system komunikatów o błędach w wyrażeniu lub błędach podczas jego obliczania
- dość duża szybkość obliczeń (niestety nie jest taka, jak skompilowany kod)
- możliwość zapisu liczb w różnych systemach: dziesiętnym, dwójkowym, ósemkowym, szesnastkowym
- wyrażenia mogą być dowolnej długości
- umożliwia definiowanie własnych funkcji za pomocą następujących jednostek:
Operatory:
+ dodawanie lub oznaczenie liczby dodatniej
- odejmowanie lub oznaczenie liczby ujemnej
* mnożenie
/ dzielenie
! silnia
( ) nawiasy
; znak oddzielający kolejne argumenty w funkcji wieloargumentowej

Funkcje:
- jednoargumentowe:
sin, cos, tan, ctan - trygonometryczne
asin - arc sin
acos - arc cos
atan - arc tan
actan - arc ctan
sqrt - pierwiastek kwadratowy
ln - logarytm naturalny
exp(x) - podnoszenie e do potęgi x
floor - "podłoga"- zaokrąglanie w dół
ceil - "sufit"- zaokrąglanie do góry
abs - wartość absolutna (bezwzgledna)
frand(x) = x * liczba losowa z przedziału <0;1>
time(0) - liczba milisekund od włączenia systemu

- dwuargumentowe:
log(x;y) - logarytm z x przy podstawie y
root(x;y) - pierwiastek z liczby x stopnia y
mod(x;y) - x modulo y, np. mod(-2;5) = -2
modulo(x;y) - prawdziwe modulo, np. modulo(-2;5) = 3
rand(x;y) - liczba losowa z przedziału <x;y>; x i y muszą być <= 32767
min(x;y) - minimum z x i y
max(x;y) - maksimum z x i y
saw(x;y) - piła, zygzak, "ząb" w każdym przedziale o długości y

- trójargumentowe:
pmod(b;n;m) = (b^n) mod m - funkcja użyteczna dla bardzo dużych liczb (dzięki możliwości redukcji modulo)
range(x;a;b) = {1, gdy (x>=a i x<b), 0 w p.p.}
xrange(x;a;b) = {x, gdy (x>=a i x<b), 0 w p.p.}

- czteroargumentowe:
rangew(x;a;b;y) = {y, gdy (x>=a i x<b), 0 w p.p.}
cykl(a;b;c;x) - jeśli modulo(x-c,a+b) < a to cykl()=0, w p.p. cykl()=1, zobacz np. cykl(3;4;1;x), gdzie 3 i 4 - to długości cyklu, a 1 - to przesunięcie

* Stałe:
Zdefiniowanych jest 15 stałych:
M_PI pi
M_PI_2 pi/2
M_PI_4 pi/4
M_1_PI 1/pi
M_2_PI 2/pi
M_1_SQRTPI 1/(pierwiastek z pi)
M_2_SQRTPI 2/(pierwiastek z pi)

M_E wartość liczby e
M_LOG2E log2(e)
M_LOG10E log10(e)
M_LN2 ln(2)
M_LN10 ln(10)

M_SQRT2 pierwiastek z 2
M_SQRT_2 (pierwiastek z)/2
NN +'nieskończoność' = 1.7e308

Można używać zapisu liczb w 4 systemach: dziesiętnym, dwójkowym, ósemkowym i szesnastkowym. Oznaczenie systemu następuje przez dopisanie odpowiedniej litery na końcu liczby:
- na końcu 'b', to tylko złożona z cyfr {0,1} (zapis binarny); np. 1011b
- na końcu 'o', to tylko złożona z cyfr {0..7} (zapis ósemkowy); np. 765o
- na końcu 'h', to tylko złożona z cyfr {0..9} oraz {a..f} lub {A..F} (zapis szesnastkowy); np. 1aFh

Można stosować uproszczony zapis niektórych wyrażeń; np. 2x+sin(5y) zamiast 2*x+sin(5*y) - czyli dla złożeń: liczba i zmienna.

* MOŻLIWOŚCI / WŁASNOŚCI:
- może być 0 zmiennych w wyrażeniu
- w wyrażeniu atomy mogą być oddzielone nieograniczoną liczbą spacji
- nazwy stałych można przykryć nazwami zmiennych - wtedy będą obliczane wartości zmiennych
- wartości obliczane są w arytmetyce liczb typu double
- maksymalna liczba cyfr po przecinku w liczbie dziesiętnej: 39 (razem 41 cyfr: 0,...)
- Możliwe zapisy: "b3hhhh" - oznacza zapis szesnastkowy

5. Systemy współrzędnych używanych przy generowaniu wykresów funkcji:
Kartezjańskie: Zmienne X, Y, Z odpowiadają współrzędnym w lewostronnym układzie

Cylindryczne: Tu używamy zmiennych a, R, Z

Sferyczne: Tu używamy zmiennych a, b, R

Rok: 2003; Autor: Artur Czekalski; e-mail: artur.czekalski @ interia.pl
Strona główna http://artursator.esy.es/programowane.php