////////////////////////////////////////////////////////////////////////////////
//  << g141.java >>
//
//  グラフィックス(4):再帰曲線(ドラゴン曲線)
//
//  初期状態(↓→)に次の4つの変換を繰り返すことにより得られる曲線をいう。
//
//  変換(1): ↓ => ↓→  
//  変換(2): ↑ => ↑←
//  変換(3): → => ↑→
//  変換(4): ← => ↓←
//
//  ↓は下方向に,↑は上方向に,←は左方向に,→は右方向に一定距離進むことを
//  意味する.
//
//  初期状態で描く曲線を1次のドラゴン曲線といい,つぎの状態で描く曲線を
//  2次のドラゴン曲線という.以下同様にしてn次のドラゴン曲線が決まる.
//
//  1次のドラゴン曲線: ↓→
//  2次のドラゴン曲線: ↓→↑→
//  3次のドラゴン曲線: ↓→↑→↑←↑→
//
// ドラゴン曲線(3次の場合)の生成過程はつぎのような木で表現できる。
//
//   深さ0               根
//                        ┌─────┴─────┐
//   深さ1         ↓                      →
//                  ┌──┴──┐          ┌──┴──┐
//   深さ2      ↓          →          ↑          ←
//              ┌─┴─┐  ┌─┴─┐  ┌─┴─┐  ┌─┴─┐
//   深さ3        ↓      →  ↑      →  ↑      ←  ↑      →
//
////////////////////////////////////////////////////////////////////////////////

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

// パネルの定義。
class gp141 extends JPanel {
  static int dx,dy,x,y;
  public void paintComponent(Graphics g) {
    super.paintComponent(g);  
    x = 200; y = 150; // 始点。
    dx = 20; dy = 20; // 増分。
    g.setColor(Color.red);
    dragon(g,'d',6);
  }
  public void dragon(Graphics g, char c, int n) {        
    if( n == 0 ) {                                                             
      if( c == 'u' ) {                                                         
        g.drawLine(x,y,x,y-dy); y = y - dy; // ↑           
      } else if( c == 'd' ) {                                                  
        g.drawLine(x,y,x,y+dy); y = y + dy; // ↓              
      } else if( c == 'l' ) {                                                
        g.drawLine(x,y,x-dx,y); x = x - dx; // ←          
      } else if( c == 'r' ) {                                       
        g.drawLine(x,y,x+dx,y); x = x + dx; // →                 
      }                                                                        
    } else {                                                                   
      if( c == 'd' ) { dragon(g,'d',n-1); dragon(g,'r',n-1); }
      if( c == 'u' ) { dragon(g,'u',n-1); dragon(g,'l',n-1); }
      if( c == 'r' ) { dragon(g,'u',n-1); dragon(g,'r',n-1); }
      if( c == 'l' ) { dragon(g,'d',n-1); dragon(g,'l',n-1); }
    }                                                                          
  }
}

// フレームの定義。
class gf141 extends JFrame {
  gf141(String t) { // コンストラクタ。
    super(t);
    // フレームのコンテントペインを取得。
    Container c = this.getContentPane();
    // パネルを生成し、フレームに追加。
    gp141 gp = new gp141();
    gp.setBackground(Color.white);
    c.add(gp,BorderLayout.CENTER);
  }
}

class g141 {
  public static void main(String[] args) {
    // フレーム生成。
    gf141 gf = new gf141("ドラゴン曲線");
    // フレームの大きさを設定
    gf.setSize(400,300);
    // 「閉じる」ボタンがクリックされたとき、プログラムを終了する。
    gf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    // フレーム表示。
    gf.setVisible(true);
  }
}
実行手順
% javac g141.java
% java g141
実行結果