Nie będę ukrywać, że Kuby wpis bardzo mnie zaintrygował. Na tyle, że postanowiłem przedstawiony problem zwizualizować w C#. Nie korzystałem z OpenGLa, nie korzystałem z DirectX. Postanowiłem przygotować zwykłą aplikację Win32, która maluje układ Lorenza na kontrolce PictureBox.
Do wizualizacji wykorzystałem 20 000 punktów. Efekt przedstawia poniższy film, który zamieściłem na Youtube:
Sam układ Lorenza opisany jest wzorem:

zastosowałem "standardowe" parametry (standardowe = z Wikipedii :) ):
r=28,σ = 10,b = 8/3
double a, r, b, d; a = 10; //sigma r = 28; b = 8/3; d = 0.005; double xp, yp, zp; //pętla obliczająca trajektorię układu for (int i = 0; i < 20000; i++) { xp = lastPoint3d.x; yp = lastPoint3d.y; zp = lastPoint3d.z; lastPoint3d.x = xp + d * a * (yp - xp); lastPoint3d.y = yp + d * (xp * (r - zp) - yp); lastPoint3d.z = zp + d * (xp * yp - b * zp); Points3d.Add(new Point3D(lastPoint3d.x,lastPoint3d.y,lastPoint3d.z)); }
W powyższej metodzie można również zmieniać ilość iteracji oraz krok (zmienna d). Jako, że aplikacja nie korzysta ze sprzętowej akceleracji (swego czasu opisywałem zabawę z OpenGL w C#) animacja nie jest zbyt wydajna.
Przy słabszych komputerach warto zmniejszyć łączną ilość punktów, w tym celu wystarczy zmienić wartość końcową pętli i.
Kuba, dzięki za inspirację :)
Oczywiście jak zawsze projekt (VS 2008) do pobrania wraz plikiem exe (44KB).
|
|