Мандельброт на Java - что-то не так с моим алгоритмом? - PullRequest
1 голос
/ 28 февраля 2011

Меня попросили отобразить набор Мандельброта на Java, но я столкнулся с проблемой.Я и мой учитель оба недоумеваем, почему это не работает правильно.

Я считаю, что это как-то связано с алгоритмом или комплексным классом, поскольку все значения, кроме положительных / отрицательных 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);

            }
        }
    } 
}

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Я думаю, что у вас широкие границы. [-200,100], где у вас должно быть [-2,1] для Re и [-1,1] для Im.

complex C = new complex(x/SCALE,y/SCALE);
0 голосов
/ 28 февраля 2011
              complex C = new complex(x/SCALE,y/SCALE); // math done on unscaled values

Так как x и y равны int с (и SCALE тоже), здесь выполняется целочисленное деление.

Попробуйте вместо этого:

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

Кстати, это не ошибка, но add() и multiply() действительно должны быть методами класса Complex, которые должны начинаться с заглавной буквы в соответствии с соглашением об именах Java.

...