Mgławice
Rezultat
Opisany w tym dziale applet tworzy obrazy przypominające mgławice fotografowane m.in. przez teleskop Hubble'a. Atraktory często wykorzystywane są do tworzenia rozmaitych grafik, efekty odpowiedniego ich użycia potrafią być zaskakująco widowiskowe.
Pomysł na atraktor (oraz jego wzór) pochodzi ze strony gamedev.net. Znajdują się tam także zrzuty ekranu z bardzo ciekawymi wynikami generowania tego atraktora.
Atraktor, który zamierzam opracować jest trójwymiarowy, dlatego wyliczamy 3 współrzędne dla każdego punktu.
- xn+1 = sin(A yn) - zn * cos(B xn)
- zn+1 = sin(xn)
- yn+1 = zn * sin(C * xn) - cos(D * yn)
W Javie przedstawia on się w następujący sposób:
W[1].war( (Math.sin(A * W[0].y) - W[0].z * Math.cos(B * W[0].x)), (W[0].z * Math.sin(C * W[0].x) - Math.cos(D * W[0].y)), Math.sin(W[0].x));
Atraktory rysuje się wyliczając kolejne punkty rekurencyjnie na podstawie poprzednich. W przypadku tego appletu mowa jest o ilościach rzędu od setek tysięcy do kilku(dziesięciu) milionów.
Oprócz prostego wyliczenia dużej ilości punktów, żeby grafika była widowiskowa i atrakcyjna trzeba ją dobrze pokolorować. W moim applecie zdecydowałem się kolorować pixele na podstawie ich gęstości w danym miejscu. Im więcej punktów trafi w jeden pixel na ekranie tym mocniej będzie on pokolorowany.
for(i=1; i<ile; i++) { W[1].war( (Math.sin(A*W[0].y)-W[0].z*Math.cos(B*W[0].x)), (W[0].z * Math.sin(C * W[0].x)-Math.cos(D*W[0].y)), Math.sin(W[0].x)); pkt2d punkcik = _3d.rzut(W[1]); x = lo28.cal_x(punkcik.x*zoom); y = lo28.cal_y(punkcik.y*zoom); W[0] = W[1]; if(x < 0) x = roz_x; if(y < 0) y = roz_y; if(x > roz_x-1) x = roz_x; if(y > roz_y-1) y = roz_y; ekran[x][y]++; int alpha = ekran[x][y]; if(alpha > 255) alpha = 255; kolor = new Color(alpha, 0, 0); g.setColor(kolor); g.drawLine(x, y, x, y); }
Instrukcja obsługi
Po lewej stronie appletu znajduje się menu z opcjami atraktora. Przy każdej zmianie opcji atraktor przestaje być generowany w wysokiej jakości i ukazuje się tylko jego uproszczony model 3D. Na tym modelu można eksperymentować z ciekawymi wartościami zmiennych. Alfa i fi to kąty używane do rzutowania obrazu 3D na ekran.
Gdy uzyska się ciekawy model 3D aby wygenerować grafikę wysokiej jakości nalezy kliknąć na przycisku "GENERUJ" na applecie. Najciekawsze efekty uzyskuje się zazwyczaj przy około 2-5 milionach cząstek. W każdej chwili można przerwać generowanie poprzez zmianę którejś z opcji.
UWAGA: applet wymaga dosyć dużej mocy obliczeniowej, na starszych komputerach mogą wystąpić problemy z wyświetlaniem i działaniem appletu.