// <applet code="MandelbrotFractal" width=800 height=600></applet>
// MandelbrotFractal.java (FB - 201003276)
// N Multi-threaded!
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.lang.Thread;
public class MandelbrotFractal extends Applet
{
Image img;
volatile int pix[]; // will be shared by all threads
int w,h,alpha;
final int maxThr = 10; // number of threads to run
// drawing area (must be xa<xb and ya<yb)
final double xa = -2.0;
final double xb = 1.0;
final double ya = -1.5;
final double yb = 1.5;
public void init()
{
w=getSize().width;
h=getSize().height;
alpha=255;
pix=new int[w*h];
manfr();
img=createImage(new MemoryImageSource(w,h,pix,0,w));
}
public void manfr()
{
long startTime = System.currentTimeMillis();
ManFrThread[] m = new ManFrThread[maxThr];
for(int i=0;i<maxThr;i++)
{
m[i]=new ManFrThread(i);
m[i].start();
}
// wait until all threads finished
boolean stop;
do
{
stop=true;
for(int j=0;j<maxThr;j++)
{
if (m[j].isAlive())
{
stop=false;
}
}
}while(!stop);
System.out.println("Number of threads: " + maxThr);
long timeInMillis = System.currentTimeMillis() - startTime;
System.out.println("Run Time in Millis: " + timeInMillis);
}
public void paint(Graphics g)
{
g.drawImage(img,0,0,this);
}
class ManFrThread extends Thread
{
int k; // id number of this thread
ManFrThread(int k)
{
this.k=k;
}
public void run()
{
double x0,x,y,a,b;
int red,green,blue;
int i,kx,ky,kc;
int imax=w*h;
// Each thread only calculates its own share of pixels!
for(i=k;i<imax;i+=maxThr)
{
kx=i%w;
ky=(i-kx)/w;
a=(double)kx/w*(xb-xa)+xa;
b=(double)ky/h*(yb-ya)+ya;
x=a;
y=b;
for(kc=0;kc<256;kc++)
{
x0=x*x-y*y+a;
y=2*x*y+b;
x=x0;
if(x*x+y*y > 4)
{
// various color palettes can be created here!
red=255-(kc%16)*16;
green=(16-kc%16)*16;
blue=(kc%16)*16;
pix[w*ky+kx]=(alpha<<24)|(red<<16)|(green<<8)|blue;
break;
}
}
}
}
}
}