1

Javaでマンデルブロ集合を表示するように求められましたが、問題が発生しました。私の先生と私は両方とも、これが正しく実行されない理由に困惑しています。

正/負の1と0を除くすべての値は、2回の反復後に無限大にエスケープされるため、アルゴリズムまたは複雑なクラスと関係があると思います。

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]、Reの場合は[-2,1]、Imの場合は[-1,1]が必要です。

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

xyints(およびも)なので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 に答える