我真的很固执,没有这个想法,我应该画一个圆圈,这很好。但是它将能够以不同的分辨率进行绘制,但是我走不通了,请帮忙!我在这里向您展示的代码不是试图使用differentnet分辨率,但是我不知道该怎么做。

我将设置遇到问题的课程,然后再设置该程序的其余部分。另外请注意,该程序稍后将用于Mandlebrot集。

问题是,圆在高分辨率下可以很好地工作,但是一旦我尝试减小它,我就会得到奇怪的线条图案,就像它只画某些线条,然后画出不应该画的线条一样,我怀疑这是问题所在是方法render()。我也怀疑更具体的问题是for循环,或我的向量的索引。如果我不清楚我的解释,请告诉我。

RESOLUTION_VERY_HIGH至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;}
            }
        }
    }
}


这是我写的Complex类;

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/

感谢您的帮助,非常感谢! :)

最佳答案

如果我正确遵循您的代码和GUI类的操作。您需要做两件事。

1)当分辨率不是VERY_HIGH时,仅为每个resolution点设置颜色。这可能有效,但前提是您要更改要绘画的像素的大小。没有GUI类,没有足够的信息要说。尽管感觉if语句if ((complex[i][j]).getAbs()>1应该读为if ((complex[i][j]).getAbs()>resolution,而i和j的增量应该为1。同样,如果没有GUI类,我也不能说。

2)要更改面板的大小,只需更改w.putData(picture,1,1);命令以读取w.putData(picture,resolution,resolution);即可。

如果这是不正确的,则指向GUI源的链接或添加当前获取的结果图片将很有帮助。

07-27 17:38