From 85751141b5705dba503b507ab34cc4ee734a9e6a Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Thu, 4 Jun 2015 22:33:05 +0200 Subject: Started own version --- .../camilstaps/mandelbrot/MandelbrotFractal.java | 96 ++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 Week15 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotFractal.java (limited to 'Week15 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotFractal.java') diff --git a/Week15 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotFractal.java b/Week15 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotFractal.java new file mode 100644 index 0000000..72c3d7a --- /dev/null +++ b/Week15 Mandelbrot/src/com/camilstaps/mandelbrot/MandelbrotFractal.java @@ -0,0 +1,96 @@ +/* + * 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; + } + +} -- cgit v1.2.3