/** Draw Spring dX ---- = a v dt dv ---- = - b (v + x) dt 横軸 x すなわち位置と、縦軸 v すなわち速度との相図 あるいは、 2 d x dx m ---- + v ---- + kx = 0 dt dt **/ import java.awt.*; import java.applet.*; public class Spring extends Applet { SpringGraph phaseCanvas; Panel PrmPanel, InitPanel, CntrlPanel, InputPanel; TextField TFalpha, TFbeta, TFinitX, TFinitV; double alpha=1.0, beta=0.1, initX = 3.0, initV = -2.0; public void init() { setLayout(new BorderLayout()); PrmPanel = new Panel(); PrmPanel.setLayout(new FlowLayout()); PrmPanel.add(new Label("alpha=", Label.RIGHT)); PrmPanel.add(TFalpha = new TextField(String.valueOf(alpha), 4)); PrmPanel.add(new Label(" beta=", Label.RIGHT)); PrmPanel.add(TFbeta = new TextField(String.valueOf(beta), 4)); InitPanel = new Panel(); InitPanel.setLayout(new FlowLayout()); InitPanel.add(new Label("Initial value X=", Label.RIGHT)); InitPanel.add(TFinitX = new TextField(String.valueOf(initX), 4)); InitPanel.add(new Label(" V=", Label.RIGHT)); InitPanel.add(TFinitV = new TextField(String.valueOf(initV), 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(3,1)); InputPanel.add(PrmPanel); InputPanel.add(InitPanel); InputPanel.add(CntrlPanel); add("Center", phaseCanvas = new SpringGraph(alpha, beta, initX, initV)); add("South", InputPanel); } public boolean action(Event ev, Object arg) { if (ev.target instanceof TextField) { alpha = Float.valueOf(TFalpha.getText().trim()).floatValue(); beta = Float.valueOf(TFbeta.getText().trim()).floatValue(); initX = Float.valueOf(TFinitX.getText().trim()).floatValue(); initV = Float.valueOf(TFinitV.getText().trim()).floatValue(); phaseCanvas.setparam(alpha, beta, initX, initV); return true; } else if (ev.target instanceof Button){ String l = ((Button)ev.target).getLabel(); if ( "Start".equals(l) ){ alpha = Float.valueOf(TFalpha.getText().trim()).floatValue(); beta = Float.valueOf(TFbeta.getText().trim()).floatValue(); initX = Float.valueOf(TFinitX.getText().trim()).floatValue(); initV = Float.valueOf(TFinitV.getText().trim()).floatValue(); phaseCanvas.setparam(alpha, beta, initX, initV); phaseCanvas.clear(); phaseCanvas.start(); } else if ( "Stop".equals(l) ){ phaseCanvas.stop(); } else if ( "Clear".equals(l) ){ phaseCanvas.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("Spring Phase Diagram"); Spring spring = new Spring(); spring.init(); spring.start(); f.add("Center", spring); f.resize(450, 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 SpringGraph extends Canvas implements Runnable { Point A = new Point(0,0), B = new Point(0,0); Point O = new Point(0,0); Point U = new Point(20,20); // Point U = new Point(8,8); static int Height, Width; static double alpha, beta, initX, initV; static double x, v, dx, dv, T, dt; Thread th; static boolean clrflg = false; public void init() { if (th == null){ th = new Thread(this); T = 0.0; } } 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) { if ( clrflg ){ g.setColor(getBackground()); g.fillRect(0, 0, Width, Height); g.setColor(getForeground()); clrflg = false; } paint(g); } public void clear() { clrflg = true; } SpringGraph(double alpha, double beta, double initX, double initY){ T = 0.0; this.alpha = alpha; this.beta = beta; this.initX = initX; this.initV = initV; x = initX; v = initV; aw2px(A, x, v); } public void setparam(double alpha, double beta, double initX, double initV){ this.alpha = alpha; this.beta = beta; this.initX = initX; this.initV = initV; x = initX; v = initV; aw2px(A, x, v); } public void aw2px(Point t, double x, double v){ t.x = (int)( x * (double)U.x + (double)O.x ); t.y = (int)( - v * (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; draw_coordinate(g); g.setColor(Color.blue); double tt = T + 1.0, dt = 0.01; while ( T <= tt ) { aw2px(A, x, v); dx = ( alpha * v) * dt; dv = - beta * ( x + v) * dt; x += dx; v += dv; aw2px(B, x, v); g.drawLine(A.x, A.y, B.x, B.y); T += dt; } } }