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; email ARTUR@epokaY.net
Strona główna www.epokaY.net/artur/programowane.php