Ява Мандельброт двигается неправильно

поэтому я пытался запрограммировать набор Мандельброта в java, я знаю, что код не очень оптимизирован, но я только начал это делать.

Идея состоит в том, что когда я нажимаю на пиксель, он помещает этот пиксель в центр (который представляет собой определенное комплексное число) и вычисляет набор вокруг него. Это работает в начале, но если я увеличу масштаб, он начнет вести себя странно. Я предполагаю, что это странная функция моего midX, midY или дисплея, но я долго смотрел на нее и не могу понять, буду признателен за помощь.

class set {
    DotWindow w;
    int[][] arrayColor;
    int max = 100;
    Grayscale gray;
    double zoom = 1.1;
    double midX = -0.5;
    double midY = 0;

    public static void main(String[] args) {
        new set().run();
    }

    void run() {
        setup();
        runLoop();

    }

    void runLoop() {
        int x;
        int y;
        while (true) {
            GameEvent event = w.getNextEvent();
            switch (event.getKind()) {
            case GameEvent.KEY_PRESSED:
                int key = event.getKey();
                if (key == 43) {
                    zoom = zoom * 1.1;
                } else if (key == 45) {
                    zoom = zoom / 1.1;
                }

                display();
                break;
            case GameEvent.MOUSE_CLICKED:
                midX = midX - (1 - event.getX() / 250.0);
                midY = midY - (1 - event.getY() / 250.0);
                System.out.println(midX);
                display();
                break;
            }

        }
    }

    void setup() {
        w = new DotWindow(500, 500, 1);
        w.checkMouse(true, false, false, false, false);
        w.checkKeys(true, false, false);
        arrayColor = new int[500][500];
        zoom = zoom / 1.1;
        display();

    }

    int calculate(double re, double im) {
        double Zre = 0;
        double Zim = 0;
        double Zim2 = 0;
        double Zre2 = 0;
        int iterations = 0;

        for (int k = 0; k < max; k++) {
            if (Zre2 + Zim2 > 4.0) {
                return k;
            }
            Zim2 = Zim * Zim;
            Zre2 = Zre * Zre;
            Zim = 2.0 * Zre * Zim + im;
            Zre = Zre2 - Zim2 + re;
            iterations = k;
        }
        return iterations;

    }

    void display() {
        for (double y = 0; y < 500; y++) {
            for (double x = 0; x < 500; x++) {
                double value = calculate((midX - (1 - x / 250) / zoom),
                        (midY - (1 - y / 250) / zoom));
                if (value == 99) {
                    w.setDot((int) x, (int) y, Color.BLACK);
                } else {
                    w.setDot((int) x, (int) y, gray = new Grayscale(
                            255 - (int) value * 2));
                }

            }

        }
    }

}

person poffsan    schedule 28.03.2013    source источник
comment
Не могли бы вы показать, какое неправильное поведение вы получаете, желательно в виде скриншота?   -  person Vesper    schedule 28.03.2013
comment
CTRL+SHIFT+F в Eclipse помогает :) Добавление тега JAVA в SO много помогает ;)   -  person Andrea Ligios    schedule 28.03.2013
comment
Спасибо :) Скриншот на самом деле ничего не объясняет, так как он выглядит правильно, но когда вы его двигаете, он двигается неправильно. Если я увеличу масштаб несколько раз, пиксель, на который я нажал, больше не будет помещаться в центр. Кажется, это работает только до тех пор, пока увеличение не слишком велико.   -  person poffsan    schedule 28.03.2013


Ответы (1)


        case GameEvent.MOUSE_CLICKED:
            midX = midX - (1 - event.getX() / 250.0)/zoom;
            midY = midY - (1 - event.getY() / 250.0)/zoom;
            System.out.println(midX);
            display();

Вы уже увеличили масштаб, скажем, в 10 раз, но изменили центральные координаты без учета значения масштабирования.

person Vesper    schedule 28.03.2013