Demonstrační aplikace pro vytváření fraktálů pomocí L-IFS systémů
Zdrojový text metody recalcFractal()
// ------------------------------------------------------------------------
// Tato metoda provede přepočet L-IFS fraktálu s využitím matice vrcholů a
// matice posloupnosti transformací.
// ------------------------------------------------------------------------
private void recalcFractal() {
double xo=5.0, yo=5.0; // stará pozice bodu
double x1, y1, x2, y2; // nová pozice bodu
double xf1, yf1, xf2, yf2; // poměr dělení úsečky
int newTransform=0; // nová transformace
int oldTransform=0; // stará transformace
int x, y;
if (!isValidFractal()) return; // zkontrolovat, zda jsou transformace korektní
Random r=new Random(0);
for (int i=0; i<ImageWidth*ImageHeight; i++)// smazat obrázek, kam bude fraktál vygenerován
pixelSrc[i]=0xff << 24;
xf1=xFraction; // výpočet koeficientu dělení úsečky
xf2=1.0-xf1;
yf1=yFraction;
yf2=1.0-yf1;
// vnější iterační smyčka
for (int i=0; i<iterations; i++) { // iterační smyčka
// vnitřní smyčka pro nalezení transformace odpovídající matici posloupnosti transformací
do { // najít novou transformaci
newTransform=(int)(r.nextDouble()*activeVertexes);
} while (!restrictions[oldTransform][newTransform]);
x1=vertexX[newTransform]; // získat polohu vybraného řídicího bodu
y1=vertexY[newTransform];
x2=xo;
y2=yo;
xo=x1*xf1+x2*xf2; // výpočet nové pozice bodu
yo=y1*yf1+y2*yf2;
if ((xo>=0) && (xo<=ImageWidth) && // pokud se nový bod nachází uvnitř obrázku
(yo>=0) && (yo<=ImageHeight) &&
(i>=startIterations)) { // a překročili jsme počet startovních iterací
x=(int)xo;
y=(int)yo;
pixelSrc[x+y*ImageWidth]=0xffffffff;// vykreslit nový bod do obrázku
}
oldTransform=newTransform;
}
applyFilter(); // aplikace vybraného filtru
image.flush(); // a vykreslení obrázku na plochu appletu
}
// ------------------------------------------------------------------------
// Konec metody recalcFractal()
// ------------------------------------------------------------------------