De GirinoWiki
package org.girino.frac;
import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.HashMap;
/**
* this is getting old. Applet to draw mandelbrot sets with zoom capability.
* @author girino
*
*/
public class FractalApplet extends Applet {
private double gammaCorrection;
public static int lambda;
private static int tam;
private static double x;
private static double y;
private static double escala;
private double multiplic;
private HashMap defaultParameters = new HashMap(7);
private int[][] values;
private FractalOperator operator;
public FractalApplet() {
defaultParameters.put("tamanho", "300");
defaultParameters.put("x0", "-0.5");
defaultParameters.put("y0", "-0.07");
defaultParameters.put("escala", "3");
defaultParameters.put("maxiter", "40");
defaultParameters.put("multiplic", "1.2");
defaultParameters.put("gammaCorrection", "0.7");
defaultParameters.put("operator", "org.girino.frac.operators.OptimizedMandelbrotOperator");
}
public void paint(Graphics g) {
if (values == null) {
run(true);
} else {
run(false);
}
}
public String getParameter(String name) {
String ret = super.getParameter(name);
if (ret == null) {
return getDefaultParameter(name);
}
return ret;
}
private String getDefaultParameter(String name) {
return (String)defaultParameters.get(name);
}
public void init() {
tam = Integer.valueOf(getParameter("tamanho")).intValue();
System.out.println(tam);
x = Double.valueOf(getParameter("x0")).doubleValue();
y = Double.valueOf(getParameter("y0")).doubleValue();
escala=(double)tam/Double.valueOf(getParameter("escala")).doubleValue();
lambda = Integer.valueOf(getParameter("maxiter")).intValue();
multiplic = Double.valueOf(getParameter("multiplic")).doubleValue();
gammaCorrection = Double.parseDouble(getParameter("gammaCorrection"));
try {
createOperator(getParameter("operator"));
} catch (Exception e) {
throw new RuntimeException(e);
}
resize(tam,tam);
prepareMouseListener();
}
private void prepareMouseListener() {
addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent ev) {
if (ev.getButton() != MouseEvent.BUTTON1) {
zoomOut(ev.getX(), ev.getY());
} else {
zoomIn(ev.getX(), ev.getY());
}
}
});
}
private void createOperator(String operatorName) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
operator = (FractalOperator)Class.forName(operatorName).newInstance();
operator.init(this);
}
private void zoomIn(int xnovo, int ynovo) {
x = x + (xnovo - tam / 2) / escala;
y = y + (ynovo - tam / 2) / escala;
escala = escala * 2;
lambda = (int) (lambda * multiplic);
forceRecalc();
}
private void forceRecalc() {
values = null;
this.repaint();
}
private void zoomOut(int xnovo, int ynovo) {
x = x + (xnovo - tam / 2) / escala;
y = y + (ynovo - tam / 2) / escala;
escala = escala / 2;
lambda = (int)((float)lambda / multiplic);
forceRecalc();
}
public void run(boolean recalc) {
Graphics g = this.getGraphics();
float sc = (float) tam / 2;
if (recalc) {
values = new int[tam][tam];
}
for(int j = 0; j < tam; j++) {
double y_offset = (j-sc)/escala;
for (int i = 0; i < tam; i++) {
if (recalc) {
values[i][j] = apply((i-sc)/escala + x, y_offset + y);
}
int iter = values[i][j];
if (iter >= lambda) {
g.setColor(new Color(0, 0, 0));
} else {
float ratio = (float)Math.pow(iter/(double)lambda, gammaCorrection);
g.setColor(new Color(1f-ratio, ratio, iter/(float)lambda));
}
g.drawLine(i,j,i,j);
}
}
}
public int apply(double x, double y) {
return operator.apply(x, y, lambda);
}
}