
EXPR
1.WSTĘP
Idea napisania programu EXPR pojawiła się w marcu 2008 roku. Wśród programów do rysowania funkcji, zauważyłem brak darmowych aplikacji, które spełniały by założenia niewielkiego rozmiaru, przenośności, interaktywności, szybkości działania, rozszerzalności. Założenia te można uznać za spełnione:
- Program zajmuje niecałe 300K, nie wymaga instalacji oraz innych plików do działania
- Jedynie ok. 10% kodu programu jest zależne od systemu co ułatwia przenoszenie aplikacji na inne OS-y (o wersji na Symbiana niżej)
- Wprowadzanie wyrażeń w konsoli, a następnie wyświetlanie wykresów jest wygodne i szybkie. Program daje szerokie możliwości interakcji oraz konfiguracji.
- Parser programu kompiluje wyrażenia do kodu maszynowego (w wersji dla procesorów x86) lub do bajt-kodu.
- Zestaw standardowych funkcji można rozbudowywać poprzez odpowiednio przygotowane biblioteki DLL, jak również użytkownik może pisać własne funkcje w wewnętrznym języku EXPRL
Oprócz wyświetlania funkcji, program umożliwia syntezę fali dźwiękowej opisanej danym wyrażeniem. Możemy też podłączyć mikrofon i modyfikować dźwięk wejściowy.
Obecną wersje programu oznaczam jako 0.91 (11.02.2009). Pliki do pobrania i link do galerii niżej.
Przykłady zastosowania programu
- Analiza matematyczna
- Generowanie opisanych matematycznie obrazów (np. fraktale, przetwarzanie grafiki rastrowej)
- Wyświetlanie map wysokości
- Generowanie ciekawych scen 3D
- Analiza sygnałów dźwiękowych
- Symulacja powierzchni zwierciadlanych
- Testowanie wydajności sprzętu
- Zwykłe obliczanie wartości wyrażeń
2.OBSŁUGA PROGRAMU
Krótki tutorial
Po uruchomieniu programu zobaczymy okno konsoli. Program domyślnie wykonuje wyrażenia zawarte w pliku autoexec.txt. Klawiszem [TAB] uaktywniamy listę funkcji i zmiennych dostępnych w programie. Naciskając klawisz [ENTER] program wkleja funkcje do pola edycji konsoli z odpowiednią ilością przecinków, które oddzielają argumenty funkcji (np. DIST(,)). Klawiszem [ESC] lub [TAB] wracamy do pola edycji i kontynuujemy wpisywanie wyrażenia (np. 2.5DIST(x,1)-3). Wielkość liter nie ma znaczenia. Po zatwierdzeniu enterem widzimy obliczoną wartość wyrażenia (w przykładzie będzie to 2.5DIST(x,1)-3=-0.5 ponieważ domyślnie zmienna x przyjmuje wartość 0, a DIST(x,y) zwraca pierwiastek z x*x+y*y).
Przechodząc do menu i wybierając File->Window->Graph, albo po prostu wciskając [F5], przechodzimy do okna wykresu. Podstawowe sterowanie to kursory, [PageUp]/[PageDown] do zmiany skali, oraz mysz. W zależności od pozycji kursora myszy, w lewym dolnym rogu widzimy wartości funkcji w danym punkcie. Jeśli w wyrażeniu występuje zmienna y, to jej wartość zależy od współrzędnej y kursora myszy. Bardziej zaawansowane opcje i ich skróty klawiszowe są opisane w pliku readme.txt, którego podgląd mamy pod klawiszem [F1] (powrót do wykresu to zawsze [F5], a do konsoli [F4]).
Klawisze [1]..[4] przełączają między trybami rysowania wykresu.
W domyślnym trybie [1] jest to rysowanie zwykłych funkcji typu y=f(x) na płaszczyźnie.
Tryb [2] to funkcje typu z=f(x,y) na płaszczyźnie. Program dla każdego punktu obrazu oblicza wartość funkcji od zadanych argumentów x i y, zaś z wyniku bierze tylko część ułamkową. Wartości 0 odpowiada kolor najciemniejszy, a wartości 1 najjaśniejszy. Przykładowo dla wyrażenia x otrzymamy pionowe paski w przejściu tonalnym, dla wyrażenia y podobnie, ale poziome paski, zaś np. dla
sin(dist(2sin(4x)+2.1cos(y),3cos(3y-sin(3x))-2sin(3x+cos(y))))^2
trzeci wykres przedstawiony na stronie głównej.
W trybie [3] przechodzimy do rysowania funkcji w 3D. Obliczona wartość wyrażenia odpowiada wysokości płaszczyzny. Każdemu punktowi, w klasycznym układzie współrzędnych (oś Z przebiega w głąb), odpowiada trójka (x,f(x,y),y).
Rozglądamy się za pomocą myszy. Lewy przycisk odpowiada za ruch do przodu, zaś prawy - do tyłu. Klawiszem [N] zwiększamy gęstość siatki (czy inaczej liczbę wierzchołków płaszczyzny). Dodatkowy wciśnięty klawisz [Shift] powoduje odwrócenie zmian, tzn. zmniejsza gęstość siatki. Podobnie w przypadku innych skrótów. Klawisz [Shift] powoduje także przyspieszanie zmian. Z resztą opcji proponuje zapoznać się samodzielnie, wykorzystując menu lub plik pomocy [F1].
W trybie 3D, wykresy mogą być wyświetlane następującymi metodami (w nawiasach kwadratowych skrót klawiszowy):
- Siatka [U]
- Wypełnione trójkąty [U] z lub bez oświetlenia ([I] dla światła)
- Teksturowane trójkąty [T] i jw.
Program domyślnie wykorzystuje OpenGL, ale posiada również własny, softwarowy silnik renderujący. Jeżeli nasza karta graficzna wspiera Pixel Shader 2.0, oraz mamy na dysku biblioteki języka Cg (dołączone do programu), to dodatkowo otrzymujemy 4 techniki wyświetlania (ich aktywacja wymaga włączenia oświetlenia (klawisz [I]), zmiana technik klawiszem [~], wyłączenie: [Shift]+[~]):
- Phong shading - cieniowanie per-pixel
- Bumpmapping
- Environment mapping - efekt odbicia środowiska
- Per-pixel Environment mapping - efekt odbicia środowiska od chropowatej powierzchni
Na tą chwilę ostatni tryb [4] umożliwia wyświetlanie funkcji opisanych równaniem parametrycznym. Rysowanie odbywa się w ten sposób: zmienna t przebiega od wartości t1 do wartości t2 przy zadanej ilości punktów. Współrzędne kolejnych punktów, które są łączone liniami, odpowiadają zmiennym x i y. Przykładowe wyrażenie PAR(2t,3sin(t)-2) odpowiada przypisaniu zmiennej x wartości 2t, a zmiennej y wartości 3sin(t)-2. Podobnie definiuje się inne funkcje. Funkcja POL(r) umożliwia odwzorowanie współrzędnych biegunowych na kartezjańskie gdzie argument r odpowiada promieniowi wodzącemu (np. dla POL(t) otrzymamy spiralę Archimedesa, a dla POL(1.5) okrąg o promieniu 1.5).
Klawisz [R] uaktywnia tryb powtarzania obliczeń. Domyślnie, po narysowaniu funkcji, komputer nie odświeża obrazu, dopóki nie poruszymy myszą lub nie wciśniemy jakiegoś klawisza. W trybie powtarzanie obliczeń, obraz jest na nowo odświeżany po każdym narysowaniu funkcji. Umożliwia to tworzenie animacji. Zmienna TIME przechowuje bieżący czas. Przykładowo, pisząc sin(x-time) otrzymamy przesuwającą się sinusoidę.
Tryb gry uaktywniamy klawiszem [B]. Wtedy zaczynają działać siły grawitacji, a przez płaszczyzny wykresu nie można swobodnie przenikać. Na tą chwile mamy do wyboru dwa modele fizyki: uproszczony oraz (domyślny) zaawansowany. Na tą chwilę ten drugi nie jest jeszcze do końca poprawny.
Jeśli chcemy wyświetlić kilka funkcji jednocześnie, musimy zmienić kolor rysowania (8 do wyboru w menu: File->Color lub skrótem Ctrl+[1]..[8]). Każde wprowadzone wyrażenie nadpisuje wprowadzoną wcześniej funkcje w tym samym kolorze. Klawiszem [TAB] w trybie wykresu/dźwięku zmieniamy aktualnie analizowaną funkcję. Możemy ją usunąć klawiszem [DEL].
Okno trybu dźwięku uaktywniamy klawiszem [F6] (lub odpowiednio wybieramy File->Window->Sound). Kursorami możemy modyfikować ustawienia miksera (głośność/balans), zaś z shiftem: natężenie i częstotliwość dźwięku. Przekazywanie wyrażeń do tego trybu odbywa się podobnie jak w trybie rysowania wykresów.
Rozszerzenia
Do programu dołączone są przydatne pluginy w plikach DLL, rozszerzające standardowy zbiór funkcji. Nowe funkcje mają w nazwie prefiks odpowiadający nazwie biblioteki.
- BMP.DLL - umożliwia wczytywanie plików BMP do pamięci, a następnie pobieranie wartości koloru z danego punktu obrazu. Przydatne np. w wyświetlaniu map wysokości zapisanych w plikach BMP
- FRACTAL.DLL - 3 funkcje umożliwiające wyświetlanie fraktali (ze zbioru Mandelbrota, Julii oraz "Płonącego Statku")
- OBJ.DLL - umożliwia wczytywanie plików OBJ i następnie wyświetlanie zapisanych w nich modeli obiektów 3D. Biblioteka nie działa jeszcze do końca poprawnie
- MT.DLL - funkcje operujące na macierzach. Możemy definiować macierze z pliku tekstowego, albo tez wczytywać je z pliku BMP. Funkcje dodawania, mnożenia przez skalar, mnożenia oraz odwracania macierzy.
Macierz możemy np. definiować tak:
MT_DEF(0, "0.4 0.6 1.2 4.3; 0.1 0.9 2.2 6.2; 0.2 0.4 0.2 0.7; 0.6 0.5 0.1 0.5; 5.4 3.2 1.2 2.3;")
albo zastosować podobną definicję w pliku tekstowym i użyć funkcji MT_LOAD(numer_macierzy,"nazwa_pliku")
Pozostałe funkcje zaczynają się także od prefiksu MT_
Definiowanie własnych funkcji daje możliwość tworzenia listy wyrażeń oraz definiowania bardziej złożonych algorytmów zawierających instrukcje warunkowe oraz pętle. Przykładowo możemy napisać funkcję obliczającą wartość szeregu. Szerszy opis w pliku readme.txt.
Konsola
Konsola jest podstawowym narzędziem. To z niej wydajemy polecenia programowi. Warto podać tu kilka przydatnych uwag:
- Jeśli uważamy że domyślna czcionka 8X8 jest za mała, wystarczy wybrać w opcjach: Console->Font size->8X16
- Zawsze warto powracać do poprzednio wpisanych wyrażeń. Umożliwiają to kursory: góra/dół
- Lista funkcji [TAB] jest rozbudowana, ale wciśnięcie odpowiedniego znaku ogranicza ten zbiór do funkcji zaczynających się właśnie od tego znaku, i tak dalej
- Zawsze możemy edytować wyrażenia w pliku tekstowym, a następnie wywołać je używając funkcji EXEC("nazwa_pliku"). Domyślnie, na początku programu, wykonywana jest zawartość pliku autoexec.txt (o ile istnieje)
- Niektóre funkcje (np. BPRINT, TABLE, SHELL) to funkcje tekstowe. Ich użycie ma sens w trybie konsoli (tzn. nie zwracają jakiś istotnych wartości, ale wypisują jakiś tekst)
- Inny typ funkcji, to funkcje sterujące (np. LOADLIB, TEX_LOAD, TEX_SETALPHA, SOUNDMODE, VIDMODE itd.), najczęściej wywoływane z okna konsoli. Zawierają one większą ilość instrukcji, dlatego, aby nie zawiesić działania programu, w trybach wykresu i dźwięku nie wykonują one żadnych operacji (zwracają np. 0)
- Jeśli nie chcemy, aby wpisywane wyrażenie zmieniało nam aktualnie rysowaną funkcje, na początku dodajemy /. Np. jeśli wpisaliśmy sin(x), a następnie /cos(x^2-2), to nadal będzie rysowana funkcja sin(x)
- Znaki > i < przed wyrażeniem powodują, że wyrażenie te będzie wykonywane raz odpowiednio przed i po rysowaniu funkcji. Szczególnie przydatne, gdy chcemy na początku zmieniać jakieś parametry bądź wykonywać w każdej klatce jakieś bardziej złożone operacje (np. generowanie tekstury w ten sposób: >TEX_FUNC3(0,"sin(x)","cos(y)","2sin(x)+cos(y)",-2,1,3,-5) - generuje teksturę gdzie kolorowi czerwonemu odpowiada wyrażenie sin(x) itd. gdzie x jest w przedziale [-2,3], a y w przedziale [-5,1])
- Wyrażenie po znaku ; to komentarz
- Ponadto w plikach tekstowych możemy stosować znaki // w celu komentowania wyrażeń
Plik konfiguracyjny
W pliku config.cfg możemy modyfikować szereg domyślnych opcji programu, między innymi domyślną rozdzielczość, palety kolorów, kolory światła, parametry fizyki w trybie gry. Możemy też uaktywnić takie opcje jak efekt przezroczystości (parametr GL_BLEND), czy mgłę (GL_FOG). Proponuje także przetestować opcje log oraz lightvec.
Pozostałe informacje
W pliku pomocy readme.txt znajdziemy między innymi opis sterowania programu, listę standardowych funkcji czy sposoby definiowania własnych funkcji. Z czasem znajdzie się tam więcej pomocnych informacji. Klawisz [F1] umożliwia podgląd tego pliku z programu.
Program opiera się na arytmetyce liczb 32-bitowych. Gwarantuje to szybkość działania, z drugiej strony dokładność obliczeń może, w pewnych zastosowaniach, okazać się niewystarczająca. Program nie był tworzony z myślą o zastosowaniach inżynierskich. Dokładność liczbowa wyników, a tym bardziej precyzja wykresów, jest w zupełności wystarczająca w zwykłych zastosowaniach. Jedynym mankamentem jest fakt, że w przy generowaniu dźwięku, nawet niewielkie odchylenia w precyzji obliczeń, są wyraźnie słyszalne. W przyszłości wersja 64-bitowa programu zniweluje te braki.
EXPR for SymbianOS (wersja 0.91 beta, kompilacja z dnia 16.02.2009)
Obecnie wersja programu EXPR na system Symbian OS 3rd Edition jest w fazie testowej, nie została jeszcze zakończona praca nad wersją finalną. Program pod względem funkcjonalności nie różni się praktycznie niczym od wersji na Windows (brakuje kilku opcji). Polecam przeczytać plik readme_symbian.txt w załączonym archiwum.
Przykładowe zdjęcia:
1
2
3
4
5
6
7
8
9
3.INFORMACJE TECHNICZNE
Wymagania sprzętowe
Ponieważ wymagania zależą tylko od celów, w jakich program zostanie użyty (do rysowania funkcji w 2D wystarczy zwykłe Pentium, bez akceleratora 3D), podaje wymagania sugerowane:
- CPU: Intel Core 2 Duo/AMD Athlon 64 X2
- RAM: 128MB
- GPU: Obsługujące Vertex i Pixel Shader 2.0, zgodne z DirectX 8.0 i OpenGL 2.0
- Karta dźwiękowa zgodna z DirectX
- Dysk: ok. 8MB na program i różne dodatki :)
- OS: Windows
Program testowałem jedynie na WinXP, więc w razie problemów prosiłbym o informacje na ten temat. Również za zgłaszanie bugów byłbym wdzięczny. Kontakt na stronie O MNIE.
Rozwiązania techniczno-algorytmiczne
- Program napisany w nowoczesnym języku C++
- Parser wyrażeń tekstowych do bajt-kodu lub do kodu maszynowego
- Biblioteka funkcji oparta na szybkich algorytmach słownikowych
- Interpreter wewnętrznego języka programowania EXPRL
- Własny, niezależny silnik graficzny 2D i 3D
- Przenośność kodu na inne systemy operacyjne wspierające język C/C++
- Rozszerzalność
- Rysowanie złożonych funkcji w 2D i 3D nie powoduje (prócz ekstremalnych przypadków) przestojów aplikacji
- Wykorzystanie OpenGL oraz języka Cg do zaawansowanej grafiki 3D
- Generator dźwięku
- Przetwarzanie dźwięku wejściowego
- Szerokie możliwości konfiguracji i dostosowania programu przez użytkownika
- Komunikacja z powłoką systemową (funkcja SHELL)
- Algorytmy przetwarzające tekstury (dostosowywanie rozmiarów dowolnych obrazów do rozmiarów tekstury, generowanie MIPMAP i map normalnych)
Planowany rozwój
- Wielowątkowość - wykorzystanie do kilkunastu CPU
- Wersja 64-bitowa
- Wykorzystanie instrukcji MMX/SSE
- Arytmetyka liczb zespolonych
- Nowe tryby rysowania funkcji
- Nowe pluginy do programu
- Dodanie zintegrowanego edytora tekstu
- Wersja programu oparta jedynie na OpenGL
- Wersje na Linuksa, MacOS, Windows Mobile
- Usprawnienie systemu pomocy
- Ogólna rozbudowa i ulepszenia, usunięcie bugów
Stan pracy nad projektem
Obecnie z powodu braku czasu (studia) zawiesiłem na razie pracę nad programem. Zapraszam jednak na stronę PROJEKTY PW gdzie znajdują się obecnie prowadzone projekty związane z moimi studiami.
Pliki do pobrania
Expr.zip
Program EXPR z pluginami DLL, plikiem pomocy, plikiem konfiguracyjnym oraz plikiem autoexec.txt zawierającym kilka przykładowych funkcji.
Expr+Cg.zip
Jak wyżej, ale archiwum zawiera biblioteki języka Cg, niezbędne do wyświetlania zaawansowanych efektów grafiki 3D.
ExprS60.zip
Wersja programu na system Symbian (czytaj wyżej).
Inne kompilacje programu (wersja 0.9):
expr_generic.exe
Podstawowa, najbardziej okrojona kompilacja programu
expr_noopengl.exe
Wersja programu bez OpenGL, oparta tylko na software'owym silniku graficznym
expr_nocg.exe
Wersja programu bez obsługi Cg
Tutorial w jaki sposób dodać do programu skybox'a:
envmap_tutor.zip
Dodatkowe pliki do programu (tekstury, czcionki, obiekty 3D, przykłady funkcji)
expr_extras.zip
Biblioteka MT.DLL zawierająca funkcje operujące na macierzach z przykładem wykorzystania
mt.zip
Źródła programu
exprsrc.zip - źródła wersji Win32
expr_s60src.zip - źródła wersji S60
Na koniec link do galerii obrazów wygenerowanych przez program EXPR: