1

我被要求在 Java 上显示 Mandelbrot 集,但我遇到了问题。我和我的老师都对为什么这不能正确运行感到困惑。

我认为它与算法或复杂类有关,因为除了正/负 1 和 0 之外的所有值在两次迭代后都会逃逸到无穷大。

import javax.swing.*;
import java.awt.*;

public class fractal {

        public class complex { double re; double im;
                public complex(double x, double y){
                    this.re =x;
                    this.im =y;
                }
                public double mag(){
                    return (Math.sqrt(re*re+im*im));
                }
        }


static int xcord = 500;
static int ycord = 500;

 public static void main(String[] args) {   
        JFrame myFrame = new JFrame("Question 10");
        myFrame.setSize(xcord,ycord);
        JPanel myPane = (JPanel) myFrame.getContentPane();
        myPane.add(new paint());
        myFrame.setVisible(true);
    }
}

class paint extends JComponent {

        public complex add(complex a, complex b){
            return new complex(a.re+b.re,a.im+b.im);
            }
         public complex multiply(complex a,complex b) {
              return new complex((a.re*b.re)-(a.im*b.im),(a.re*b.im)+(a.im*b.re));
            }




public void paint (Graphics g){

    final int SCALE =100; //pixels per unit
    int itr = 0;
    int max_itr = 30;
    Color clr = Color.black;
    g.translate(fractal.xcord/2, fractal.ycord/2); // Move origin to center of frame


    for (int x = -2*SCALE; x <= 1*SCALE; x++){

        for (int y = -1*SCALE; y <= 1*SCALE; y++){

            complex C = new complex(x/SCALE,y/SCALE); // math done on unscaled values
            complex z = C;
            itr = 0;

            while ( z.mag() <= 4.0 && itr < max_itr){ 

                z = add(multiply(z,z),C);   
                itr++;

                }

            if (itr == max_itr){
                clr = Color.black;
            }

            else{
                clr = new Color((int) Math.round(itr*8.5),(int) Math.round(itr*8.5),(int) Math.round(itr*8.5)); // Colouring of fractal
            }

            g.drawOval(x, y, 2, 2);
            g.setColor(clr);

            }
        }
    } 
}
4

2 回答 2

3

我认为你必须有广泛的界限。[-200,100],你应该有 [-2,1] 用于 Re 和 [-1,1] 用于 Im。

complex C = new complex(x/SCALE,y/SCALE);
于 2011-02-27T21:34:17.087 回答
0
              complex C = new complex(x/SCALE,y/SCALE); // math done on unscaled values

因为xandyints(SCALE也是),所以你在这里进行整数除法。

试试这个:

              complex C = new complex((double)x/SCALE,(double)y/SCALE); // math done on unscaled values

顺便说一句,这不是一个错误,而add()实际上multiply()应该是Complex类的方法,根据 Java 命名约定应该大写。

于 2011-02-27T22:11:09.313 回答