Ã¥×¥í¥°¥é¥ß¥ó¥°(2015)

.
.
Cプログラミング (2015)
−
EGGX
第 14 回
によるアニメーション作成−
松田七美男
2016 年 1 月 21 日
単振り子(Pendulum)
振れ角 θ の運動方程式
θ̈ = −
θ
T
m
mg
g
sin θ
L
単振り子(Pendulum)
振れ角 θ の運動方程式
θ̈ = −
g
sin θ
L
.
解析解は,形式的に t の陽関数
t = g(θ) として求まり,楕円積分
θ
T
m
mg
関数で表される.楕円積分関数の
逆関数は楕円函数であるが,C 言
語の標準数学ライブラリには含ま
.れていない.
単振り子(Pendulum)
振れ角 θ の運動方程式
θ̈ = −
g
sin θ
L
.
解析解は,形式的に t の陽関数
t = g(θ) として求まり,楕円積分
θ
T
m
à
mg
関数で表される.楕円積分関数の
逆関数は楕円函数であるが,C 言
語の標準数学ライブラリには含ま
.れていない.
数値解析に恰好の題材
単振り子のアニメーション
繰り返し手順
振れ角 θ を 4 次のルンゲ・クッタ法で計算 rk4fixv6()
静止画像の作成:
I
おもりの位置 ~
r = L(sin θ, − cos θ) の算出
I
画像を全て消去 gclr(win)
I
天井等の背景の描画
I
紐の描画
I
おもりの描画
表示レイヤーへの一括コピー copylayer(win,1,0)
静止画を適切な時間表示 msleep(***)
.
単振り子のアニメーション
繰り返し手順
振れ角 θ を 4 次のルンゲ・クッタ法で計算 rk4fixv6()
静止画像の作成:
I
おもりの位置 ~
r = L(sin θ, − cos θ) の算出
I
画像を全て消去 gclr(win)
I
天井等の背景の描画
I
紐の描画
I
おもりの描画
表示レイヤーへの一括コピー copylayer(win,1,0)
静止画を適切な時間表示 msleep(***)
.
経過時間と周期の求め方
. ほぼ刻み幅 h の精度で求めることができる.
1
. h が小さすぎると動きが遅くなり,不自然なアニメー
2
ションに見える.
経過時間と周期の求め方
. ほぼ刻み幅 h の精度で求めることができる.
1
. h が小さすぎると動きが遅くなり,不自然なアニメー
2
ションに見える.
. 常微分方程式は刻み h で計算して,動きが不自然に遅く
3
ならないように,間引いて表示する.
.
.
「1000 回に1回」に間引く
t += h;
. if ( (int)(t/h) % 1000 ) { 描画命令群 };
. 方法 1:θ = 0 を通過する時間(1 往復に 2 回ある)を検
知して,その差の 2 倍を周期とみなす.
4
rk4xv6(),rk4x.o
の利用
講義で作成した関数を再利用する.
. #include "rk4x.h" により,vec6 と rk4xv6() 関
1
数の定義を読み込む.
2. rk4x.o をリンクする.
./egg -o pendulum pendulum.c rk4x.o
. rk4x.o は以下のように作成する.
3
gcc -c rk4x.c
llpoly() によるくり抜き
曲線 y = f (x) を境界にして面を塗りつぶすときには,図
のように曲線の端を含めた曲線上の N 個の節点 (cxi , cyi ) と
領域の端を 2 点 (cxN , cyN ), (cxN +1 , cyN +1 ) を追加定義して,
llpoly(cx, cy, N+2, 0) と呼び出します.ここに cx,cy はそれ
ぞれ大きさ N + 2 の実数配列です.
(cxN+1, cyN+1)
(cxN, cyN)
(cxN-1, cyN-1)
(cx0, cy0)
(cx1, cy1)
y = f(x)
(cxk, cyk)