代表Mandelbrot和Julia在Java中以图形方式设置

时间:2016-05-24 04:04:27

标签: java mandelbrot

我正在研究一个问题,我需要先使用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 个答案:

答案 0 :(得分:2)

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

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*x

除此之外:还有一些效率空间,因为您计算了y*y1两次。