- Wstęp
- Mam wzór
- Trójkąt Sierpińskiego - 4 algorytmy
- Zbiór Mandelbrota
- Algorytm IFS
- Autor
|
Algorytm generowania tego fraktala polega na procesie iteracji (wielokrotnego przekształcania) współrzędnych rysowanego punktu. Początkowo losowo wybieramy współrzędne punktu, a następnie również losowo wybieramy jedno z przekształceń afinicznych z odpowiednim prawdopodobieństwem. Po obliczeniu nowych współrzędnych punktu, proces powtarzamy określoną ilość razy.
|
Odwzorowanie afiniczne na płaszczyźnie
jest to przekształcenie, które punktowi (x,y) przyporządkowuje punkt (x',y') w następujący sposób:
(x,y) → ( ax + by + c, dx + ey + f)
|
Wracając do naszego przykładu. Aby wygenerować paproć Barnsleya, należy użyć poniższych przekształceń losowo w następujących proporcjach: 85:7:7:1
I to jest największa "tajemnica" dla każdej rysowanej figury : ilość przekształceń, ich współczynniki, oraz prawdopodobieństwa zastosowań.
Np trójkąt Sierpińskiego generujemy przy pomocy układu 3-ech przekształceń afinicznych.
f1(x,y) = (0.85x + 0.04y, - 0.04x + 0.85y + 1.6)
f2(x,y) = ( - 0.15x + 0.28y , 0.26x + 0.24y + 0.44)
f3(x,y) = (0.20x - 0.26y , 0.23x + 0.22y + 1.6)
f4(x,y) = (0 , 0.16y)
|
Ale wróćmy do naszej figury. Wystarczy zdefiniować przekształcenia i narysować wg dość prostego pomysłu:
void paprotka()
{
t[0][0].war(0.85,0.04,0.0);
t[0][1].war(-0.04,0.85,1.6);
t[1][0].war(-0.15,0.28,0.0);
t[1][1].war(0.26,0.24,0.44);
t[2][0].war(0.10,-0.26,0.0);
t[2][1].war(0.23,0.22,1.6);
t[3][0].war(0.0,0.0,0.0);
t[3][1].war(0.0,0.16,0.0);
p1=78;
p2=20;
p3=21;
p4=5;
}
|
void rysuj(Graphics g)
{
int los,ktore;
double xp;
for(int i=0;i<30000;i++)
{
los=mat.losowa_c(100)+1;
if(los<=p4) {ktore=3;g.setColor(Color.gray);}
else
if(los<=p3) {ktore=2;g.setColor(Color.blue);}
else
if(los<=p3+p2) {ktore=1;g.setColor(Color.red);}
else {ktore=0;g.setColor(Color.green);}
xp=p.x;
p.x=t[ktore][0].x*xp+t[ktore][0].y*p.y+t[ktore][0].z;
p.y=t[ktore][1].x*xp+t[ktore][1].y*p.y+t[ktore][1].z;
lo28.punkt(g,p);
}
}
|
|