. . 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)
© Copyright 2024 ExpyDoc