高橋裕樹 アニメーション 乱数の利用 java 演習 (7)...

33
Java 演習 (7) アニメーション 高橋 裕樹 アニメーション 乱数の利用 ボールの反射 Java 演習 (7) アニメーション 高橋 裕樹

Upload: others

Post on 14-May-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射Java演習 (7)– アニメーション –

高橋 裕樹

Page 2: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

アニメーション

例題

ボールが左から右に等速直線運動するアニメーションプログラムを作成せよ.

等速直線運動

一定速度 v で,ある空間内で一定方向に物体が移動する運動x(t) = x(0) + vx t

物体の時刻 t における位置: x(t)速度: vx

Page 3: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

水平方向に等速直線運動するボール (BallMove1-1.java)

import javax.swing.JApplet;import javax.swing.Timer;import java.awt.Graphics;import java.awt.Dimension;import java.awt.event.*;

public class BallMove1 extends JApplet {Dimension d;int x, vx;

10

public void init(){d = getSize();x = 0; vx = 1;

new Timer(20, new ActionListener(){public void actionPerformed(ActionEvent e){

if(x < d.width) x += vx;else x = 0;

repaint(); 20

}}).start();

}

Page 4: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

水平方向に等速直線運動するボール (BallMove1-2.java)

public void paint(Graphics g){g.clearRect(0, 0, d.width, d.height);g.drawArc(x, 10, 10, 10, 0, 360);

}}

Page 5: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

Timerクラス

Timer

Timer(int delay, ActionListener listener)

delay: メソッド (java.awt.event.ActionListener) を呼び出す時間間隔 (ms: millisecond)listener: アクションリスナインタフェース

アクションイベントが発生 ⇒ actionPerformed メソッドactionPerformed メソッドに記述された文が一定間隔で実行

15-22行目

現在の座標値 xに,速度 vxを加算

repaintメソッド呼び出し ⇐ 再描画 (paintメソッド)

Timer().start();⇐ タイマの開始

25-28行目

clearRectメソッド ⇐ 明示的に背景を塗りつぶす

Page 6: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

BallMove1.javaのボールの速度を倍にしたアニメーションプログラムを作成せよ.

Page 7: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

ボールが上から下に等速直線運動するアニメーションプログラムを作成せよ.

Page 8: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

ボールが右から左に等速直線運動するアニメーションプログラムを作成せよ.

Page 9: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

2次元平面上の運動

例題

ボールが平面上を等速直線運動するアニメーションプログラムを作成せよ.

2次元平面上の運動

直交する座標軸成分に分解x , y 軸方向成分

各成分ごとに等速直線運動x(t) = x(0) + vx t

y(t) = y(0) + vy t

Page 10: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

2次元平面上の運動

2次元平面上で等速直線運動するボール (BallMove5-1.java)

import javax.swing.JApplet;import javax.swing.Timer;import java.awt.Graphics;import java.awt.Dimension;import java.awt.event.*;

public class BallMove5 extends JApplet {Dimension d;int x, y, vx, vy, w = 10;

10

public void paint(Graphics g){g.clearRect(0, 0, d.width, d.height);g.drawArc(x, y, w, w, 0, 360);

}

Page 11: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

2次元平面上の運動2次元平面上で等速直線運動するボール (BallMove5-2.java)

public void init(){d = getSize();x = y = 0;vx = 1; vy = 2;

new Timer(20, new ActionListener(){public void actionPerformed(ActionEvent e){

if(x < d.width && y < d.height){x += vx;y += vy; 10

}else{

x = y = 0;}

repaint();}

}).start();}

} 20

Page 12: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ランダムな位置からの等速直線運動

例題

ボールが描画領域のランダムな位置から等速直線運動するアニメーションプログラムを作成せよ.

Page 13: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

乱数

乱数

Math.randomメソッド0 ≤ x < 1 doubleの乱数

条件

描画範囲: 幅 d.width × 高さ d.height

ボール: 幅 w × 高さ wの外接矩形

初期位置

x 座標: 0以上 (d.width - w)未満の整数

y 座標: 0以上 (d.height - w)未満の整数

Page 14: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 15: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 16: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 17: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 18: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 19: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 20: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

キャスト

初期位置

x 座標: 0以上 (d.width - w)未満の整数(d.width - w) * Math.random()

⇒ doubleの値

数値演算精度の高い型に暗黙に変換整数型 * double型 ⇒ double型

ボールの描画

drawArc(int x, int y, int w, int h, int theta, int

phi)

キャスト

明示的な型変換(型) 文

(int)((d.width - w) * Math.random())

Page 21: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

2次元平面上で等速直線運動するボール (BallMove6-1.java)

import javax.swing.JApplet;import javax.swing.Timer;import java.awt.Graphics;import java.awt.Dimension;import java.awt.event.*;

public class BallMove6 extends JApplet {Dimension d;int x, y, vx, vy, w = 10;

10

public void paint(Graphics g){g.clearRect(0, 0, d.width, d.height);g.drawArc(x, y, w, w, 0, 360);

}

Page 22: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

2次元平面上で等速直線運動するボール (BallMove6-2.java)

public void init(){d = getSize();x = (int)((d.width − w) * Math.random());y = (int)((d.height − w) * Math.random());vx = 1; vy = 2;

new Timer(20, new ActionListener(){public void actionPerformed(ActionEvent e){

if(x < d.width && y < d.height){x += vx; 10

y += vy;}else{

x = (int)((d.width − w) * Math.random());y = (int)((d.height − w) * Math.random());

}

repaint();}

}).start(); 20

}}

Page 23: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

ボールが描画領域のランダムな位置からランダムなスピードで等速直線運動するアニメーションプログラムを作成せよ.ただし,x , y 方向の速度は正に制限する.

Page 24: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

ボールが描画領域のランダムな位置からランダムなスピードで等速直線運動するアニメーションプログラムを作成せよ.

Page 25: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 26: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 27: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 28: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 29: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 30: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

ボールの反射

例題

ボールが描画範囲内を壁に反射しながら左右に等速直線運動するアニメーションプログラムを作成せよ.

反射

ボール左 → 右 ...(反射)... 左 ← 右壁に衝突すると進行方向が反転

x 座標 ... 0以下 または d.width - 1 - w以上a

進行方向が反転 ⇒ 速度の符号を反転

a正確な衝突判定ではない

Page 31: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

水平方向に反射しながら等速直線運動するボール (BallMove9-1.java)

import javax.swing.JApplet;import javax.swing.Timer;import java.awt.Graphics;import java.awt.Dimension;import java.awt.event.*;

public class BallMove9 extends JApplet {Dimension d;int x, w = 10, vx;

10

public void paint(Graphics g){g.clearRect(0, 0, d.width, d.height);g.drawArc(x, d.height − w − 1, w, w, 0, 360);

}

Page 32: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

水平方向に反射しながら等速直線運動するボール (BallMove9-2.java)

public void init(){d = getSize();x = 10;vx = 1;

new Timer(20, new ActionListener(){public void actionPerformed(ActionEvent e){

if(x <= 0 | | x + w >= d.width − 1) vx *= −1;x += vx;repaint(); 10

}}).start();

}}

Page 33: 高橋裕樹 アニメーション 乱数の利用 Java 演習 (7) …img2.hc.uec.ac.jp/~rocky/lecture/java/slides/lec07.pdfJava 演習(7) { アニメーション {高橋裕樹 アニメーション

Java 演習 (7)– アニメーション

高橋 裕樹

アニメーション

乱数の利用

ボールの反射

練習

練習

ボールが描画領域内で壁に反射しながら 2次元平面内で等速直線運動するプログラムを作成せよ.