情報学部 | 菅沼ホーム | Java 目次 | 基礎技術目次 | 索引 |
x = x0 + vt (1) x(t+dt) = x(t) + v・dt (2)
001 import java.awt.*; 002 import java.awt.event.*; 003 import javax.swing.*; 004 005 public class Test { 006 public static void main (String[] args) 007 { 008 Win win = new Win("等速直線運動"); 009 } 010 } 011 012 class Win extends JFrame 013 { 014 /******************/ 015 /* コンストラクタ */ 016 /******************/ 017 Win(String name) 018 { 019 // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す) 020 super(name); 021 // Windowの大きさ 022 setSize(640, 470); // +40, +70 023 // ContentPane の取得と MainPanel の追加 024 Dimension d = getSize(); // Windowの大きさ 025 d.width -= 40; 026 d.height -= 70; 027 MainPanel pn = new MainPanel(d); // MainPanel オブジェクトの生成 028 getContentPane().add(pn); // MainPanel オブジェクトを ContentPane に追加 029 // ウィンドウを表示 030 setVisible(true); 031 // イベントアダプタ 032 addWindowListener(new WinEnd()); 033 } 034 035 /******************************/ 036 /* 上,左,下,右の余白の設定 */ 037 /******************************/ 038 public Insets getInsets() 039 { 040 return new Insets(50, 20, 20, 20); 041 } 042 043 /************/ 044 /* 終了処理 */ 045 /************/ 046 class WinEnd extends WindowAdapter 047 { 048 public void windowClosing(WindowEvent e) { 049 System.exit(0); 050 } 051 } 052 } 053 054 class MainPanel extends JPanel implements Runnable 055 { 056 boolean state = true; 057 double x, y, x0 = 0.0, t = 0.0, dt = 0.1, v = 20.0; 058 Dimension d; 059 Thread th; 060 061 MainPanel(Dimension d1) 062 { 063 d = d1; 064 x = x0; 065 y = d.height / 2; 066 setBackground(new Color(238, 255, 238)); // 背景色の設定 067 th = new Thread(this); // スレッドの生成とスタート 068 th.start(); 069 } 070 // 他ページへ移動の際,一時的にスレッドを停止 071 public void stop() 072 { 073 state = false; 074 } 075 // スレッドの実行 076 public void run() 077 { 078 while (state) { 079 try { 080 th.sleep(33); 081 } 082 catch (InterruptedException e) {} 083 if (x < d.width) { 084 t += dt; 085 x = v * t; // x += v * dt; でも良い 086 } 087 else { 088 x = x0; 089 t = 0; 090 } 091 repaint(); 092 } 093 } 094 // 描画 095 public void paintComponent(Graphics g) 096 { 097 super.paintComponent(g); // 親クラスの描画 098 099 g.setColor(Color.green); 100 g.fillOval((int)x-20, (int)y-20, 40, 40); 101 } 102 }
v = v0 + at (3) x = x0 + v0t + 0.5at2 (4) v(t+dt) = v(t) + a・dt (5) x(t+dt) = x(t) + 0.5(v(t) + v(t+dt))・dt (6) ( dt が小さいときの近似式)
001 import java.awt.*; 002 import java.awt.event.*; 003 import javax.swing.*; 004 005 public class Test { 006 public static void main (String[] args) 007 { 008 Win win = new Win("等加速度運動"); 009 } 010 } 011 012 class Win extends JFrame 013 { 014 /******************/ 015 /* コンストラクタ */ 016 /******************/ 017 Win(String name) 018 { 019 // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す) 020 super(name); 021 // Windowの大きさ 022 setSize(640, 470); // +40, +70 023 // ContentPane の取得と MainPanel の追加 024 Dimension d = getSize(); // Windowの大きさ 025 d.width -= 40; 026 d.height -= 70; 027 MainPanel pn = new MainPanel(d); // MainPanel オブジェクトの生成 028 getContentPane().add(pn); // MainPanel オブジェクトを ContentPane に追加 029 // ウィンドウを表示 030 setVisible(true); 031 // イベントアダプタ 032 addWindowListener(new WinEnd()); 033 } 034 035 /******************************/ 036 /* 上,左,下,右の余白の設定 */ 037 /******************************/ 038 public Insets getInsets() 039 { 040 return new Insets(50, 20, 20, 20); 041 } 042 043 /************/ 044 /* 終了処理 */ 045 /************/ 046 class WinEnd extends WindowAdapter 047 { 048 public void windowClosing(WindowEvent e) { 049 System.exit(0); 050 } 051 } 052 } 053 054 class MainPanel extends JPanel implements Runnable 055 { 056 boolean state = true; 057 double x, y, x0 = 0.0, t = 0.0, dt = 0.04, v0 = 0.0, v, a = 100.0; 058 Dimension d; 059 Thread th; 060 061 MainPanel(Dimension d1) 062 { 063 d = d1; 064 x = x0; 065 y = d.height / 2; 066 v = v0; 067 setBackground(new Color(238, 255, 238)); // 背景色の設定 068 th = new Thread(this); // スレッドの生成とスタート 069 th.start(); 070 } 071 // 他ページへ移動の際,一時的にスレッドを停止 072 public void stop() 073 { 074 state = false; 075 } 076 // スレッドの実行 077 public void run() 078 { 079 while (state) { 080 try { 081 th.sleep(40); 082 } 083 catch (InterruptedException e) {} 084 if (x < d.width) { 085 t += dt; 086 x = v0 * t + 0.5 * a * t * t; 087 // double v1 = v; 088 // double v2 = v + a * dt; 089 // x += 0.5 * (v1 + v2) * dt; 090 // v = v2; 091 } 092 else { 093 x = x0; 094 v = v0; 095 t = 0; 096 }; 097 repaint(); 098 } 099 } 100 // 描画 101 public void paintComponent(Graphics g) 102 { 103 super.paintComponent(g); // 親クラスの描画 104 105 g.setColor(Color.green); 106 g.fillOval((int)x-20, (int)y-20, 40, 40); 107 } 108 }
vx = vx0 vy = vy0 - gt x = x0 + vx0t y = y0 + vy0t - 0.5gt2
001 import java.awt.*; 002 import java.awt.event.*; 003 import javax.swing.*; 004 005 public class Test { 006 public static void main (String[] args) 007 { 008 Win win = new Win("自由落下"); 009 } 010 } 011 012 class Win extends JFrame 013 { 014 /******************/ 015 /* コンストラクタ */ 016 /******************/ 017 Win(String name) 018 { 019 // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す) 020 super(name); 021 // Windowの大きさ 022 setSize(640, 470); // +40, +70 023 // ContentPane の取得と MainPanel の追加 024 Dimension d = getSize(); // Windowの大きさ 025 d.width -= 40; 026 d.height -= 70; 027 MainPanel pn = new MainPanel(d); // MainPanel オブジェクトの生成 028 getContentPane().add(pn); // MainPanel オブジェクトを ContentPane に追加 029 // ウィンドウを表示 030 setVisible(true); 031 // イベントアダプタ 032 addWindowListener(new WinEnd()); 033 } 034 035 /******************************/ 036 /* 上,左,下,右の余白の設定 */ 037 /******************************/ 038 public Insets getInsets() 039 { 040 return new Insets(50, 20, 20, 20); 041 } 042 043 /************/ 044 /* 終了処理 */ 045 /************/ 046 class WinEnd extends WindowAdapter 047 { 048 public void windowClosing(WindowEvent e) { 049 System.exit(0); 050 } 051 } 052 } 053 054 class MainPanel extends JPanel implements Runnable 055 { 056 boolean state = true; 057 double x, y, x0 = 0.0, y0, t = 0.0, dt = 0.04, vx0 = 100.0, vy0 = -200.0, vy, g = 98.0; 058 Dimension d; 059 Thread th; 060 061 MainPanel(Dimension d1) 062 { 063 d = d1; 064 y0 = d.height / 2; 065 x = x0; 066 y = y0; 067 vy = vy0; 068 setBackground(new Color(238, 255, 238)); // 背景色の設定 069 th = new Thread(this); // スレッドの生成とスタート 070 th.start(); 071 } 072 // 他ページへ移動の際,一時的にスレッドを停止 073 public void stop() 074 { 075 state = false; 076 } 077 // スレッドの実行 078 public void run() 079 { 080 while (state) { 081 try { 082 th.sleep(40); 083 } 084 catch (InterruptedException e) {} 085 if (x < d.width && y < d.height) { 086 t += dt; 087 x = vx0 * t; // この行と次の行の代わりに,それ以降の5行でも良い 088 y = y0 + vy0 * t + 0.5 * g * t * t; 089 // x += vx0 * dt; 090 // double v1 = vy; 091 // double v2 = vy + g * dt; 092 // y += 0.5 * (v1 + v2) * dt; 093 // vy = v2; 094 } 095 else { 096 x = x0; 097 y = y0; 098 vy = vy0; 099 t = 0; 100 }; 101 repaint(); 102 } 103 } 104 // 描画 105 public void paintComponent(Graphics g) 106 { 107 super.paintComponent(g); // 親クラスの描画 108 109 g.setColor(Color.green); 110 g.fillOval((int)x-20, (int)y-20, 40, 40); 111 } 112 }
001 import java.awt.*; 002 import java.awt.event.*; 003 import javax.swing.*; 004 005 public class Test { 006 public static void main (String[] args) 007 { 008 Win win = new Win("等速度運動と等加速度運動"); 009 } 010 } 011 012 class Win extends JFrame 013 { 014 /******************/ 015 /* コンストラクタ */ 016 /******************/ 017 Win(String name) 018 { 019 // JFrameクラスのコンストラクタ(Windowのタイトルを引き渡す) 020 super(name); 021 // Windowの大きさ 022 setSize(640, 470); // +40, +70 023 // ContentPane の取得と MainPanel の追加 024 Dimension d = getSize(); // Windowの大きさ 025 d.width -= 40; 026 d.height -= 70; 027 MainPanel pn = new MainPanel(d); // MainPanel オブジェクトの生成 028 getContentPane().add(pn); // MainPanel オブジェクトを ContentPane に追加 029 // ウィンドウを表示 030 setVisible(true); 031 // イベントアダプタ 032 addWindowListener(new WinEnd()); 033 } 034 035 /******************************/ 036 /* 上,左,下,右の余白の設定 */ 037 /******************************/ 038 public Insets getInsets() 039 { 040 return new Insets(50, 20, 20, 20); 041 } 042 043 /************/ 044 /* 終了処理 */ 045 /************/ 046 class WinEnd extends WindowAdapter 047 { 048 public void windowClosing(WindowEvent e) { 049 System.exit(0); 050 } 051 } 052 } 053 054 class MainPanel extends JPanel implements Runnable 055 { 056 boolean state = true; 057 double x0 = 0.0, x1, x2, y1, y2; // x方向の初期位置と各物体の位置 058 double t = 0.0, dt = 0.04; // 時間とその刻み幅 059 double v0 = 50.0, v1, v2; // 初期速度と各物体の速度 060 double a = 30.0; // 加速度 061 double ang1 = 20.0 * Math.PI / 180.0, ang2 = -20.0 * Math.PI / 180.0; // 進行方向 062 Dimension d; // パネルの幅と高さ 063 Thread th; 064 065 MainPanel(Dimension d1) 066 { 067 d = d1; 068 x1 = x0; 069 y1 = d.height / 2; 070 v1 = v0; 071 x2 = x0; 072 y2 = d.height / 2; 073 v2 = v0; 074 setBackground(new Color(238, 255, 238)); // 背景色の設定 075 th = new Thread(this); // スレッドの生成とスタート 076 th.start(); 077 } 078 // 他ページへ移動の際,一時的にスレッドを停止 079 public void stop() 080 { 081 state = false; 082 } 083 // スレッドの実行 084 public void run() 085 { 086 while (state) { 087 try { 088 th.sleep(40); 089 } 090 catch (InterruptedException e) {} 091 if (x2 < d.width) { 092 x1 += v1 * dt * Math.cos(ang1); 093 y1 += -v1 * dt * Math.sin(ang1); 094 double t1 = v2; 095 double t2 = v2 + a * dt; 096 v2 = t2; 097 x2 += 0.5 * (t1 + t2) * dt * Math.cos(ang2); 098 y2 += -0.5 * (t1 + t2) * dt * Math.sin(ang2); 099 } 100 else { 101 x1 = x0; 102 v1 = v0; 103 y1 = d.height / 2; 104 x2 = x0; 105 v2 = v0; 106 y2 = d.height / 2; 107 t = 0; 108 }; 109 repaint(); 110 } 111 } 112 // 描画 113 public void paintComponent(Graphics g) 114 { 115 super.paintComponent(g); // 親クラスの描画 116 117 g.setColor(Color.green); 118 g.fillOval((int)x1-20, (int)y1-20, 40, 40); 119 g.setColor(Color.red); 120 g.fillOval((int)x2-20, (int)y2-20, 40, 40); 121 } 122 }
情報学部 | 菅沼ホーム | Java 目次 | 基礎技術目次 | 索引 |