/* * Copyright (c) 2015 Camil Staps */ package com.camilstaps.mandelbrot; import java.util.HashMap; import java.util.Map; /** * * @author camilstaps */ public class MandelbrotFractal { private static final Map mandelNumbers = new HashMap<>(); public static int mandelNumber(double x, double y, int repetitions) { Point p = new Point(x, y); return mandelNumber(p, repetitions); } public static int mandelNumber(Point p, int repetitions) { if (mandelNumbers.containsKey(p)) { Result result = mandelNumbers.get(p); if (repetitions < result.repetitions || result.mandelNumber < result.repetitions) { return result.mandelNumber; } else { calculateMandelNumber(p, repetitions, result); return result.mandelNumber; } } else { Result result = calculateMandelNumber(p, repetitions); mandelNumbers.put(p, result); return result.mandelNumber; } } protected static Result calculateMandelNumber(Point p, int repetitions) { Result start = new Result(); start.x = p.x; start.y = p.y; calculateMandelNumber(p, repetitions, start); return start; } protected static void calculateMandelNumber(Point p, int repetitions, Result start) { int n = start.repetitions; while (start.x * start.x + start.y * start.y <= 4 && n <= repetitions) { double new_x = start.x * start.x - start.y * start.y + p.x; start.y = 2 * start.x * start.y + p.y; start.x = new_x; n++; } start.mandelNumber = n; } public static class Point { double x, y; public Point(double x, double y) { this.x = x; this.y = y; } @Override public boolean equals(Object another) { if (another == null || another.getClass() != Point.class) { return false; } Point that = (Point) another; return that.x == x && that.y == y; } @Override public int hashCode() { int hash = 7; hash = 97 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32)); hash = 97 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32)); return hash; } @Override public String toString() { return String.format("(%f,%f)", x, y); } } protected static class Result { int mandelNumber = -1, repetitions = -1; double x, y; } }