Ciekawe efekty wizualne można uzyskać naprawdę w bardzo prosty sposób. Wystarczy znaleźć funkcję matematyczną, której wizualizacja będzie wystarczająco efektowna. Postanowiłem więc się zmierzyć z tym problemem. Przedstawiony program działa wykorzystując OpenGL, współpracujący z C# dzięki bibliotece CsGL (http://csgl.sourceforge.net/).
Tym razem nie będę opisywać dokładnie co robi program. Zakładam, że czytelnik wie, czym jest OpenGL i jak go użyć. Dla osób, które nie znają OpenGLa, a chcą go poznać, polecem kurs Nehe (http://nehe.gamedev.net/).
Jak wspomniałem na wstępie, wizualizować będę funkcję. Do mojego eksperymentu wybrałem funkcję:
, gdzie zmianna „i” jest iterowana. Generalnie, całą animację tworzy właśnie zmienna „i”.
Zanim jednak zacznę pisać projekt w C#, sprawdzę jak będzie wyglądać wykres w Matlabie. Dzięki Matlabowi, po wpisaniu kilku linijek kodu będę miał wyobrażenie o efekcie końcowym. Animację w Matlabie można utworzyć wykorzystując komendę getframe, która zapamiętuje klatki filmu. Całość kodu w Matlabie wygląda tak:
N=500; [X,Y] = meshgrid(-8:0.5:8); m=moviein(N); for i=1:N R = sqrt(X.^(2) + Y.^2)+3+sin(i/50)*4; Z = (sin(R)./R)*3; surf(X,Y,Z) m(:,i)=getframe; grid on; end movie(m);
Cóż, przechodzę więc do implementacji w C#. Oprócz animacji, która jest wynikiem wspomnianej zmiennej „i” w naszej funkcji (w kodzie CS reprezentowana jest przez zmienną "rot"), dodałem jeszcze obrót całego wykresu wokół osi Y, oraz delikatną zmianę kąta, pod którym patrzę na animację. Podstawowe przekształcenia macierzowe znajdują się w funkcji glDraw, samo liczenie wartości funkcji odbywa się w funkcji CountSurface. Dodam jeszcze, że funkcja CountColor odpowiedzialna jest za określenie koloru wykresu. Im wyższa wartość funkcji w danym kroku animacji, tym kolor zbliża się ku czerwieni.
Poniżej zamieszczam zrzut ekranu z projektu:

Pełny efekt animacji dostępny w projekcie, polecam więc jego pobranie.
Skompilowany projekt (wymagany .net framework 3.5): surface-bin.zip (106KB)
Źródła projektu (VS 2008): surface-source.zip (137KB)
Jak widać, potrzebny jest niewielki nakład pracy, a efekt końcowy jest naprawdę interesujący. Kod źródłowy jest skomentowany, może więc służyć jako baza do kolejnych projektów wykorzystujących OpenGL oraz C#.
|
|