有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用Java图形表示Mandelbrot和Julia集

我正在解决一个问题,需要使用OpenCL以图形方式表示Mandelbrot集,并首先处理顺序代码。然而,它产生的图像不是很好,我不确定我是否错过了什么,或者这仅仅是一个缺乏分辨率的问题(可以这么说)。我已经发布了下面的代码以及它产生的屏幕截图——这是我应该期待的,还是我把它搞砸了

public class SequentialMandelbrot {

    private static int[] colorMap;
    private static int xSize = 200, ySize = 200;
    private static float yMin = -2f, yMax = 2f;
    private static float xMin = -2f, xMax = 2f;
    private static float xStep =  (xMax - xMin) / (float)xSize;
    private static float yStep =  (yMax - yMin) / (float)ySize;
    private static final int maxIter = 250;
    private static BufferedImage image;
    private static JComponent imageComponent;   

    public static void main(String[] args) {

        // Create the image and the component that will paint the image
        initColorMap(32, Color.RED, Color.GREEN, Color.BLUE);
        image = new BufferedImage(xSize, ySize, BufferedImage.TYPE_INT_RGB);
        imageComponent = new JPanel()
        {
            private static final long serialVersionUID = 1L;
            public void paintComponent(Graphics g)
            {
                super.paintComponent(g);
                g.drawImage(image, 0,0,this);
            }   
        };

        for (int j = 0; j < xSize; j++) {
            for (int k = 0; k < ySize; k++) {
                int iter = mandelbrot(j, k);
                if (iter == maxIter) {
                    image.setRGB(j, k, 0);                  
                } else {
                    int local_rgb = colorMap[iter%64];
                    image.setRGB(j, k, local_rgb);
                }
            }
        }

        JFrame frame = new JFrame("JOCL Simple Mandelbrot");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new BorderLayout());
        imageComponent.setPreferredSize(new Dimension(xSize, ySize));
        frame.add(imageComponent, BorderLayout.CENTER);
        frame.pack();

        frame.setVisible(true);
    }

    private static int mandelbrot(float j, float k) {
        int t = 0;
        float norm = 0;
        float x = 0;
        float y = 0;
        float r = xMin + (j * xStep);
        float i = yMin + (k * yStep);
        while (t < maxIter && norm < 4) {
            x = (x*x) - (y*y) + r;
            y = (2*x*y) + i;
            norm = (x*x) + (y*y);
            t++;
        }
        return t;
    }

Mandelbrot Set

我还修改了Julia集的代码(从数字0.45+0.1428i),它产生了同样令人怀疑的东西:
Julia Set


共 (1) 个答案

  1. # 1 楼答案

    这是你的迭代循环,这是不正确的

    while (t < maxIter && norm < 4) {
        x = (x*x) - (y*y) + r;
        y = (2*x*y) + i;
        norm = (x*x) + (y*y);
        t++;
    }
    

    在重新使用x计算y之前,您正在覆盖它。我建议使用临时变量,例如

    while (t < maxIter && norm < 4) {
        tempx = (x*x) - (y*y) + r;
        y = (2*x*y) + i;
        x = tempx;
        norm = (x*x) + (y*y);
        t++;
    }
    

    旁白:在计算x*xy*y两次时,也有提高效率的空间