0

再帰的な方法に基づいてフラクタル ツリーを描画する Java プログラムがあり、スムーズに成長するように見せたいのですが、その方法がわかりません。

以下は私のコードです。これは学校の課題ですが、基本的な課題はフラクタル ツリーを描くことだけでした。これは既に達成しています。アニメーションは二次的なものであり、私が達成したい個人的な目標です。

package Question4;

import java.awt.BasicStroke;
import java.awt.Canvas; 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;

public class FractalTree1 extends Canvas {

  // fields for drawing
  private JFrame frame;
  private final int WINDOW_WIDTH = 1280;
  private final int WINDOW_HEIGHT = 720;

  public FractalTree1() {
    frame = new JFrame("Fractal Tree");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    frame.setLocationRelativeTo(null);
    frame.setResizable(true);
    frame.add(this);
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    FractalTree1 ft = new FractalTree1();
    ft.setVisible(true);
    ft.setBackground(Color.black);
  }

  @Override
  public void paint(Graphics g) {
    g.setColor(Color.green);
    drawFractalTree(g, WINDOW_WIDTH / 2, WINDOW_HEIGHT - 75, -90, 11);
  }

  public void drawFractalTree(Graphics g, int x1, int y1, double angle, int depth) {
    if (depth == 0) {
    } else {
      int x2 = x1 + (int) (Math.cos(Math.toRadians(angle)) * depth * 10.0);
      int y2 = y1 + (int) (Math.sin(Math.toRadians(angle)) * depth * 10.0);

      Graphics2D g2d = (Graphics2D) g;
      g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,     RenderingHints.VALUE_ANTIALIAS_ON);

      g2d.setStroke(new BasicStroke(0.5f * depth));
      g2d.drawLine(x1, y1, x2, y2);

      drawFractalTree(g, x2, y2, angle + 30, depth - 1);
      drawFractalTree(g, x2, y2, angle - 30, depth - 1);
    }
  } 
}

編集 フォローアップとして... Thread.sleep() を追加すると、再帰がそれを描画する方法であるため、ぎこちなく見えます。実際の木の「成長」をシミュレートするように、強制的に「幹」から上に描画することは可能でしょうか?

4

3 に答える 3

1

それを機能させるには、おそらくdouble bufferingを使用する必要があります。基本的に、オフスクリーン バッファーに描画し、描画が完了したら画面に更新します。

drawFractalTree() メソッドで、描画を遅らせるために Thread.sleep() 呼び出しを追加する必要があります。これを g2d.drawLine(x1, y1, x2, y2); の直後に追加します。トリックを行う必要があります。非常に遅くなる場合があります。これを抑えるには、カウンターを使用して、10 回目の呼び出しごとに 1 ミリ秒スリープします。

于 2013-03-28T13:25:12.750 に答える
0

アニメーションの表示を開始するには、drawFractalTree() の先頭に Thread.sleep(100) 呼び出しを追加します。

于 2013-03-28T13:30:16.510 に答える