/** Draw Rorentz Attractor where differential equations are dX ---- = - \sigma X + \sigma Y dt dY ---- = - X Z + r X - Y dt dY ---- = XY - b Z dt \sigma = 10, b = 8/3, r = 28 \sigma は プラントル定数、流体の拡散係数と熱伝導係数の比 r, b は 容器の形や流体の性質に関するパラメータ 文献「カオスとフラクタル ---非線形の不思議---」山口昌哉、ブルーバックス **/ import java.awt.*; import java.applet.*; import java.util.Random; public class Rorentz extends Applet { RorentzGraph drawingCanvas; Panel PrmPanel, CntrlPanel, InputPanel; TextField TFsigma, TFr, TFb, TFinit; double sigma=10.0, b=8.0/3.0, r=28.0; public void init() { setLayout(new BorderLayout()); PrmPanel = new Panel(); PrmPanel.setLayout(new FlowLayout()); PrmPanel.add(new Label("sigma=", Label.RIGHT)); PrmPanel.add(TFsigma = new TextField(String.valueOf(sigma), 4)); PrmPanel.add(new Label(" b=", Label.RIGHT)); PrmPanel.add(TFb = new TextField(String.valueOf(b), 4)); PrmPanel.add(new Label(" r=", Label.RIGHT)); PrmPanel.add(TFr = new TextField(String.valueOf(r), 4)); CntrlPanel = new Panel(); CntrlPanel.setLayout(new FlowLayout()); CntrlPanel.add(new Button("Start")); CntrlPanel.add(new Button("Stop")); CntrlPanel.add(new Button("Clear")); InputPanel = new Panel(); InputPanel.setLayout(new GridLayout(2,1)); InputPanel.add(PrmPanel); InputPanel.add(CntrlPanel); add("Center", drawingCanvas = new RorentzGraph(sigma, b, r)); add("South", InputPanel); drawingCanvas.start(); } public boolean action(Event ev, Object arg) { if (ev.target instanceof TextField) { sigma = Float.valueOf(TFsigma.getText().trim()).floatValue(); b = Float.valueOf(TFb.getText().trim()).floatValue(); r = Float.valueOf(TFr.getText().trim()).floatValue(); drawingCanvas.setparam(sigma, b, r); return true; } else if (ev.target instanceof Button){ String l = ((Button)ev.target).getLabel(); if ( "Start".equals(l) ){ drawingCanvas.start(); } else if ( "Stop".equals(l) ){ drawingCanvas.stop(); } else if ( "Clear".equals(l) ){ drawingCanvas.clear(); } return true; } else return true; } public boolean handleEvent(Event e) { if (e.id == Event.WINDOW_DESTROY) { stop(); destroy(); System.exit(0); return true; } else { return super.handleEvent(e); } } public static void main(String args[]) { PFrame f = new PFrame("Rorentz Attractor"); Rorentz rorentz = new Rorentz(); rorentz.init(); rorentz.start(); f.add("Center", rorentz); f.resize(420, 500); f.show(); } } class PFrame extends Frame { PFrame(String title) { super(title); } public boolean handleEvent(Event e) { if (e.id == Event.WINDOW_DESTROY) { dispose(); System.exit(0); } return false; } } class RorentzGraph extends Canvas implements Runnable { static Point A = new Point(0,0), B = new Point(0,0); static Point O = new Point(0,0); static Point U = new Point(8,8); int Height, Width; static double sigma = 10.0, b = 8.0/3.0, r = 28.0; static double x, y, z, dx, dy, dz, t, dt; Random rnd; Thread th; boolean clrflg = false; public void init() { if (th == null){ th = new Thread(this); } } public void start() { if (th == null) { th = new Thread(this); th.start(); } else th.resume(); } public void stop() { if (th != null) { th.suspend(); } } public void run() { while (true) { try { Thread.sleep(100); } catch (InterruptedException e) { break; } repaint(); } } public void update(Graphics g) { paint(g); } public void clear() { setForeground(Color.black); this.getGraphics().fillRect(0, 0, Width, Height); setForeground(Color.red); } RorentzGraph(double sigma, double b, double r){ rnd = new Random(); x = rnd.nextDouble(); y = rnd.nextDouble(); z = rnd.nextDouble(); t = 0.0; this.sigma = sigma; this.b = b; this.r = r; aw2px(A, x, y); setBackground(Color.black); setForeground(Color.red); repaint(); } public void setparam(double sigma, double b, double r){ this.sigma = sigma; this.b = b; this.r = r; } public void aw2px(Point t, double x, double y){ t.x = (int)( x * (double)U.x + (double)O.x ); t.y = (int)( - y * (double)U.y + (double)O.y ); } public void draw_coordinate(Graphics g) { g.setColor(Color.pink); for (int i = -10; i <= 10; i++) { aw2px(A, -10,i); aw2px(B, 10,i); g.drawLine(A.x, A.y, B.x, B.y); } for (int i = -10; i <= 10; i++) { aw2px(A, i,-10); aw2px(B, i, 10); g.drawLine(A.x, A.y, B.x, B.y); } g.setColor(Color.black); aw2px(A,0,-10); aw2px(B,0, 10); g.drawLine(A.x, A.y, B.x, B.y); aw2px(A,-10,0); aw2px(B,10,0); g.drawLine(A.x, A.y, B.x, B.y); } public void paint(Graphics g) { Height = size().height; Width = size().width; O.x = Height / 2; O.y = Width / 2; g.setColor(Color.red); double tt = t + 1.0, dt = 0.01; while ( t <= tt ) { dx = (- sigma * x + sigma * y) * dt; dy = (-x * z + r * x - y) * dt; dz = (x * y - b * z) * dt; aw2px(A, x, y); x += dx; y += dy; z += dz; aw2px(B, x, y); g.drawLine(A.x, A.y, B.x, B.y); t += dt; } } }