2016-05-24 9 views
1

私は、OpenCLを使ってグラフィックを使ってMandelbrotを表現し、私のシーケンシャルコードを最初に処理する必要がある問題に取り組んでいます。しかし、それが作り出しているイメージはあまり良くありません。私はどこかで何かを見逃してしまったのか、これが単なる解決の欠如(話すこと)の問題であるのか分かりません。私はそれが何を生産するのスクリーンショットと一緒に下のコードを掲載しました - これは私が期待していたか、私はこれをどこかに混乱させるべきですか?MandelbrotとJuliaをJavaでグラフィカルに表現する

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

私はまた、(数0.45 + 0.1428iから)を設定し、それが均等に疑問何か作り出すジュリアのコードを変更した:これはあなたの反復ループである
Julia Set

答えて

2

をこれは間違っています。 yを計算し、それを再使用する前に、あなたはxを上書きしている

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

。私は、このような脇

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を計算しているとして、いくつかの効率のための部屋が、あまりにもそこにあります。

+0

2番目の目に感謝します。ああ、私はその馬鹿馬鹿しさを逃していたとは信じられない。また、ええ、私はそれをきれいにしようとしているので効率のためのスペースがあることを知っています。目的はそれを同時に実行させることですが、作業中のコードを実行したいと思っています:) – Syzorr

+0

チェックしたいと思っていました。それは素晴らしいです:) – Syzorr

関連する問題