FractalApplet (java)

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);
	}
}
Ferramentas pessoais
Social Blogging
  • StumbleUpon
  • Adicionar aos Favoritos BlogBlogs
  • Adicionar esta página no Linkk
  • Add to Technorati Favorites
patrocinadores
Espaço comercial