/** * */ package xplayer.visualizer.model; import javafx.scene.paint.Color; import xplayer.visualizer.model.MandelbrotBean.ColorSchema; /*----------------------------------------------------------------------- * * ----------------------------------------------------------------------- * * * Julia Set * * ----------------------------------------------------------------------- * * ----------------------------------------------------------------------- */ class JuliaSet { /** * Size of the coordinate system for the Julia set */ private static final double JULIA_RE_MIN = -1.5; /** * The julia re max. */ private static final double JULIA_RE_MAX = 1.5; /** * The julia im min. */ private static final double JULIA_IM_MIN = -1.5; /** * The julia im max. */ private static final double JULIA_IM_MAX = 1.5; /** The bean. */ private final MandelbrotBean bean = new MandelbrotBean(50, JULIA_RE_MIN, JULIA_RE_MAX, JULIA_IM_MIN, JULIA_IM_MAX, 0.3, -0.5); /** VisualizerDrawer instance. */ private final VisualizerDrawer visualizerDrawer; /** * Constructor. * * @param visualizerDrawer * the visualizer drawer */ JuliaSet(VisualizerDrawer visualizerDrawer) { this.visualizerDrawer = visualizerDrawer; } /** * Draws the Julia Set. */ public void drawJuliaSet() { // int X_OFFSET = 50 // int Y_OFFSET = 50 // Move canvans to the middlepoint visualizerDrawer.setLayoutX(visualizerDrawer.canvasWidth / 2.00); visualizerDrawer.setLayoutY(visualizerDrawer.canvasHeight / 2.00); // setLayoutX(canvasWidth / ( bean.getReMax() - bean.getReMin() ) / 2 + // X_OFFSET / 2) // setLayoutY(canvasHeight / ( bean.getImMax() - bean.getImMin() ) / 2 - // Y_OFFSET * 2) bean.setColorSchema(ColorSchema.GREEN); bean.setConvergenceColor(Color.BLUEVIOLET); // Calculations float[] pSample = visualizerDrawer.stereoMerge(visualizerDrawer.pLeftChannel, visualizerDrawer.pRightChannel); float[] array = visualizerDrawer.returnBandsArray(pSample, 2); // System.out.println(array[0] + " , " + array[1]) bean.setZ(-array[0] + array[0] < 0.5 ? -0.4 : -0.1);// bean.setZ(0.3) bean.setZi(array[1] + 0.4);// bean.setZi(-0.5) // Paint it double precision = Math.max( ( bean.getReMax() - bean.getReMin() ) / visualizerDrawer.canvasWidth, ( bean.getImMax() - bean.getImMin() ) / visualizerDrawer.canvasHeight); // 0.004 double convergenceValue; for (double c = bean.getReMin(), xR = 0; xR < visualizerDrawer.canvasWidth; c += precision, xR++) { for (double ci = bean.getImMin(), yR = 0; yR < visualizerDrawer.canvasHeight; ci += precision, yR++) { //Calculate convergenceValue convergenceValue = bean.isIsMandelbrot() ? checkConvergence(ci, c, 0, 0, bean.getConvergenceSteps()) : checkConvergence(bean.getZi(), bean.getZ(), ci, c, bean.getConvergenceSteps()); double t1 = convergenceValue / bean.getConvergenceSteps(); // (50.0..) double c1 = Math.min(255 * 2 * t1, 255); double c2 = Math.max(255 * ( 2 * t1 - 1 ), 0); //Set Fill visualizerDrawer.gc.setFill(convergenceValue != bean.getConvergenceSteps() ? getColorSchema(c1, c2) : bean.getConvergenceColor()); visualizerDrawer.gc.fillRect(xR, yR, 1, 1); } } } /** * Checks the convergence of a coordinate (c, ci) The convergence factor * determines the color of the point. * * @param ci * the ci * @param c * the c * @param z * the z * @param zi * the zi * @param convergenceSteps * the convergence steps * @return the int */ private int checkConvergence(double ci , double c , double z , double zi , int convergenceSteps) { for (int i = 0; i < convergenceSteps; i++) { double ziT = 2 * ( z * zi ); double zT = z * z - ( zi * zi ); z = zT + c; zi = ziT + ci; if (z * z + zi * zi >= 4.0) { return i; } } return convergenceSteps; } /** * Gets the color schema. * * @param c1 * the c 1 * @param c2 * the c 2 * @return the color schema */ private Color getColorSchema(double c1 , double c2) { MandelbrotBean.ColorSchema colorSchema = bean.getColorSchema(); switch (colorSchema) { case RED: return Color.color(c1 / 255.0, c2 / 255.0, c2 / 255.0); case YELLOW: return Color.color(c1 / 255.0, c1 / 255.0, c2 / 255.0); case MAGENTA: return Color.color(c1 / 255.0, c2 / 255.0, c1 / 255.0); case BLUE: return Color.color(c2 / 255.0, c2 / 255.0, c1 / 255.0); case GREEN: return Color.color(c2 / 255.0, c1 / 255.0, c2 / 255.0); case CYAN: return Color.color(c2 / 255.0, c1 / 255.0, c1 / 255.0); default: return Color.color(c2 / 255.0, c1 / 255.0, c2 / 255.0); } } }