Нарисуйте круг с низким разрешением

1

Я действительно застрял и из идей об этом, я должен нарисовать круг, который идет хорошо. Но это будет возможность рисоваться в разных разрешениях, и я никуда не буду, пожалуйста, помогите! Код, который я покажу вам, не пытается работать с разрешениями differnet, но у меня нет идей, что делать.

Я подниму класс, с которым у меня возникнут проблемы, и затем я оставлю оставшуюся часть программы. Также быстро заметим, что в дальнейшем программа будет использоваться для множеств Мандлброта.

Проблема в том, что круг отлично работает с высоким разрешением, но как только я попытаюсь его уменьшить, я получаю странные линейные шаблоны, например, он рисует только определенные строки, а затем рисует строки, которые не предполагается, я подозреваю, что проблема это метод render(). Я также подозреваю, что проблема более конкретно - for-loops или индекс моих векторов. Если я неясен в своем объяснении, скажите мне.

RESOLUTION_VERY_HIGH to RESOLUTION_VERY_LOW имеют значения 2048, 1024,..., 128.

package mandelbrot;
import java.awt.Color;

import se.lth.cs.ptdc.fractal.MandelbrotGUI;

public class Generator {
    public Generator() {

    }

    public void render(MandelbrotGUI w) {
        w.disableInput();
        int resolution = 1;

         switch (w.getResolution()) {
            case MandelbrotGUI.RESOLUTION_VERY_HIGH:
             resolution = 1;
             break;
            case MandelbrotGUI.RESOLUTION_HIGH:
              resolution = 3;
              break;
            case MandelbrotGUI.RESOLUTION_MEDIUM:
              resolution = 5;
              break;
            case MandelbrotGUI.RESOLUTION_LOW:
              resolution = 7;
              break;
            case MandelbrotGUI.RESOLUTION_VERY_LOW:
              resolution = 9;
              break;
            }

        Complex complex[][] = mesh(w.getMinimumReal(), w.getMaximumReal(), w.getMinimumImag(),
                w.getMaximumImag(), w.getWidth(), w.getHeight());

        Color[][] picture = new Color[w.getHeight()][w.getWidth()];

        for (int i = 0; i<w.getHeight(); i+=resolution) {
            for (int j = 0; j<w.getWidth(); j+=resolution) {
                if ((complex[i][j]).getAbs()>1) {
                    picture[i][j] = Color.WHITE;
                }
                else {
                    picture[i][j] = Color.BLUE;
                }
            }
        }

        w.putData(picture, 1, 1);
        w.enableInput();
    }

    private Complex[][] mesh(double minReal, double maxReal, double minImaginary,
                                double maxImaginary, int width, int height) {

        Complex[][] matrice = new Complex[height][width];
        for (int i = 0; i<height; i++) {
            for (int j = 0; j<width; j++) {
                matrice[i][j] = new Complex((minReal + ((maxReal-minReal)/width)*j),
                                            ((maxImaginary - (((maxImaginary - minImaginary)/height)*i))));

            }
        }
        return matrice;
    }
}

Я сомневаюсь, что они вам нужны, но вот другие классы;

Мой основной;

package mandelbrot;
import se.lth.cs.ptdc.fractal.MandelbrotGUI;

public class Mandelbrot {
    public static void main (String[] args) {
        MandelbrotGUI w = new MandelbrotGUI();
        Generator generator = new Generator();
        boolean zoomValue = false;

        while (true) {
            switch(w.getCommand()) {

                case MandelbrotGUI.QUIT: System.exit(0);
                break;

                case MandelbrotGUI.RENDER:
                    generator.render(w);
                break;

                case MandelbrotGUI.RESET:
                w.clearPlane();
                w.resetPlane();
                zoomValue = false;
                break;

                case MandelbrotGUI.ZOOM:
                    if (zoomValue) {
                            w.clearPlane();
                            generator.render(w);
                            break;
                    }
                    else {break;}
            }
        }
    }
}

и вот сложный класс, который я написал;

package mandelbrot;

public class Complex {
    double real;
    double imaginary;

    public Complex (double real, double imaginary) {
        this.real = real;
        this.imaginary = imaginary;
    }

    double getReal() {
        return real;
    }
    double getImaginary() {
        return imaginary;
    }

    double getAbs() {
        return Math.hypot(real, imaginary);
    }

    void add(Complex c) {
        real += c.getReal();
        imaginary += c.getImaginary();
    }

    void multiply(Complex c) {
        real = (real*c.getReal()) - (imaginary*c.getImaginary());
        imaginary = (real*c.getImaginary()) + (imaginary*c.getReal());
    }
}

Спецификации GUI, которые вы можете найти здесь; http://fileadmin.cs.lth.se/cs//Education/EDA016/javadoc/cs_eda016_doc/

Спасибо за любую помощь, очень ценю! :)

  • 0
    Вы бы случайно не получили ссылку на источник для класса GUI? Не требуется, но облегчает отладку, если вы точно видите, о чем говорите, и хотя я могу воспроизвести из спецификации, это много печатает. :)
  • 0
    Что общего между кругами и фракталами Мандельброта? Если бы мне пришлось нарисовать круг, я бы использовал функции синуса и косинуса, которые дают истинный круг.
Теги:
graphics
fractals

2 ответа

0

Ну, похоже, я решил проблему, метод render должен выглядеть так:

public void render(MandelbrotGUI w) {
    w.disableInput();
    int resolution = 1;

     switch (w.getResolution()) {
        case MandelbrotGUI.RESOLUTION_VERY_HIGH:
         resolution = 1;
         break;
        case MandelbrotGUI.RESOLUTION_HIGH:
          resolution = 3;
          break;
        case MandelbrotGUI.RESOLUTION_MEDIUM:
          resolution = 5;
          break;
        case MandelbrotGUI.RESOLUTION_LOW:
          resolution = 7;
          break;
        case MandelbrotGUI.RESOLUTION_VERY_LOW:
          resolution = 9;
          break;
        }

    Complex complex[][] = mesh(w.getMinimumReal(), w.getMaximumReal(), w.getMinimumImag(),
            w.getMaximumImag(), w.getWidth(), w.getHeight());

    Color[][] picture = new Color[w.getHeight()/resolution + 1][w.getWidth()/resolution + 1];

    for (int i = 0; i<w.getHeight(); i+=resolution) {
        for (int j = 0; j<w.getWidth(); j+=resolution) {
            if ((complex[i][j]).getAbs()>1) {
                picture[i/resolution][j/resolution] = Color.WHITE;
            }
            else {
                picture[i/resolution][j/resolution] = Color.BLUE;
            }
        }
    }

    w.putData(picture, resolution, resolution);
    w.enableInput();
}

Приращение было j+ = разрешение и i+ = разрешение, я также поместил индекс Color [] [] в w.getHeight/resolution + 1 и w.getWidth/resolution + 1.

Объяснение состоит в том, что я сравниваю только каждую "разрешающую" строку (например, каждую третью строку для разрешения 3) и каждый "разрешающий" пиксель в этой строке. w.getWidth/resolution + 1 мне нужно только w.getWidth/resolution + 1 элемент (и то же самое для w.getHeight).

Затем я сделал picture[i/resolution][j/resolution], я думаю, что проблема прежде заключалась в том, что я сохранил слишком много элементов, а затем, когда pixize был увеличен, у меня было слишком много пикселей.

Кроме того, w.putData(picture, resolution, resolution); , что означало, что я расширил pixize, и поэтому разрешение было ниже.

Спасибо за все неприятности, что люди здесь помогли мне помочь.

0

Если я правильно соблюдаю ваш код и работу класса GUI. Вам нужно сделать две вещи.

1) Если в разрешении, отличном от VERY_HIGH, вы устанавливаете только цвет для каждой точки resolution. Это может работать, но только если вы измените размер пикселя, который вы рисуете. Без GUI-класса недостаточно информации. Я получаю ощущение, что оператор if ((complex[i][j]).getAbs()>1 должен читать if ((complex[i][j]).getAbs()>resolution и приращение для я и j должно быть 1. Опять же, без класса GUI, я не могу сказать.

2) Чтобы изменить размер пизделя, все, что вам нужно изменить, это w.putData(picture,1,1); команда для чтения w.putData(picture,resolution,resolution); ,

Если это неверно, ссылка на источник GUI или добавление фотографий результатов, которые вы сейчас получаете, поможет.

  • 0
    Ну, я бы хотел иметь доступ к источнику графического интерфейса, но я получил только спецификации, так что это примерно та же информация, что и я. Я постараюсь реализовать ваши мысли в коде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню