Source Code of Mandelbrot32
import java.awt.Color;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;
import javax.swing.JFrame;
import java.util.HashSet;
import com.amd.aparapi.Kernel;
import com.amd.aparapi.Range;
import com.amd.aparapi.device.*;
public class Mandelbrot32 extends JFrame{
private final int dx = Toolkit.getDefaultToolkit().getScreenSize().width;
private final int dy = Toolkit.getDefaultToolkit().getScreenSize().height;
private final float scale = 3f;
private final BufferedImage image = new BufferedImage(dx, dy, BufferedImage.TYPE_INT_RGB);
private final int[] rgb = ((DataBufferInt)image.getRaster().getDataBuffer()).getData(); // extract the underlying RGB buffer from the image
private final int group = 8; // size of GPU shader groups (default: 32)
private final Range range = Range.create2D(selectGPU(), dx-dx%group+(dx%group==0?0:group), dy-dy%group+(dy%group==0?0:group), group, group);
private final MandelKernel kernel = new MandelKernel(dx, dy, rgb);
private float mx=dx/2, my=dy/2;
private float s=scale, x=-0.5f, y=0f;
public static void main(String[] args) {
new Mandelbrot32();
}
public Mandelbrot32() {
setUndecorated(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setExtendedState(JFrame.MAXIMIZED_BOTH);
getContentPane().setBackground(Color.BLACK);
setVisible(true);
update(scale, x, y);
HashSet pressed = new HashSet();
MouseAdapter mouseAd = new MouseAdapter() {
public void mousePressed(MouseEvent e) {
mx = (float)(e.getX()-dx/2)/dy;
my = (float)(e.getY()-dy/2)/dy;
if(e.getButton() == MouseEvent.BUTTON1) pressed.add(-1);
if(e.getButton() == MouseEvent.BUTTON3) pressed.add(-2);
if(e.getButton() == MouseEvent.BUTTON2) {
mx += x/s;
my += y/s;
pressed.add(-3);
}
}
public void mouseReleased(MouseEvent e) {
if(e.getButton() == MouseEvent.BUTTON1) pressed.remove(-1);
if(e.getButton() == MouseEvent.BUTTON3) pressed.remove(-2);
if(e.getButton() == MouseEvent.BUTTON2) pressed.remove(-3);
}
public void mouseDragged(MouseEvent e) {
if(pressed.contains(-3)) {
float px = (float)(e.getX()-dx/2)/dy;
float py = (float)(e.getY()-dy/2)/dy;
x = (mx-px)*s;
y = (my-py)*s;
update(s, x, y);
}
}
};
addMouseListener(mouseAd);
addMouseMotionListener(mouseAd);
Thread keyAction = new Thread("keyAction") {
public void run() {
double st;
float zoom=0, l=s;
while(true) {
st = time();
if(pressed.contains(-1) && !pressed.contains(-2)) {
zoom--;
s = scale*(float)Math.exp(zoom*0.1f);
x -= mx*(s-l);
y -= my*(s-l);
update(s, x, y);
l = s;
}
if(pressed.contains(-2) && !pressed.contains(-1)) {
zoom++;
s = scale*(float)Math.exp(zoom*0.1f);
x -= mx*(s-l);
y -= my*(s-l);
update(s, x, y);
l = s;
}
pause(1.0/60.0-time()+st);
}
}
};
keyAction.start();
}
public void update(float scale, float x, float y) {
kernel.setArea(scale, x, y);
kernel.execute(range);
getGraphics().drawImage(image, 0, 0, null);
}
public class MandelKernel extends Kernel{
@Constant private final int dx, dy;
private int rgb[];
@Constant private final int MAX = 512; // maximum iterations
@Constant final private int texture[] = new int[MAX]; // texture map
private float scale = 0f, ox=0f, oy=0f;
public MandelKernel(int dx, int dy, int[] rgb) {
this.dx = dx;
this.dy = dy;
this.rgb = rgb;
for(int i=0; i 0) {
try {
Thread.sleep((int)(t*1E3));
} catch(Exception e) {}
}
}
}