運動量保存則とは、衝突や合体などの2 体間の力のみで作用するときに、 物体が持っている運動量の合計はつねに一定で決して変わらないという法則である。 質量m1 とm2の2体が衝突する時、衝突前の速度V1とV2、衝突後の速度U1 とU2 とする。
運動量保存則 m1V1 + m2V2 = m1U1 + m2U2
となる。さて、この運動量保存則を確かめるのシミュレータの製作をここから行うものとする。半径5のボールが二つあるものとし、片方は1フレームあたりX方向へ2進み、もう片方は停止状態である。二次元平面状の正方形の形をした箱の中で二つのボールが左右に移動しているプログラムを製作し、さらに文字の表記で運動量保存則が確かめられるように製作しなさい。二つのボールのy軸の座標は同じものとする。また、質量は1として考え、省略していいものとする。
サンプル:ls2_21s.cpp
参考例:ls2_21.exe
ウインドウのサイズは640×480 箱は始点X:40 Y40 終点X:400 Y:400の360×360のサイズである。 ヒント 運動量保存則の前に、まずボールがどういう条件で衝突するか、 と言う点を考える必要性がある。 今回、ボールが衝突するのは ・壁に衝突した際 ・ボールに衝突した際 の二つの条件のみを考えれば良い。 また、今回は二次元の平面での考え方を想定しているのでz軸については考えな くて良い。 衝突条件についてはボールの中心座標同士の距離がふたつのボールの半径の合計 値より下回る場合に判定と設定する。 壁はボールと壁の距離がボールの半径より下回る場合、判定と設定する。 今回、math.hをインクルードしていいものとする。 その場合、pow関数、abs関数、sqrt関数を利用すること。 ※pow(定数1,定数2); (定数1)を(定数2)乗する、という役割を持つ関数。 定数1,定数2はdouble型を参照する。 ※型の変更について int型の定数、あるいは変数は下記のように変換することが可能である。 int x; double y; x = 5; y = (double)(x); この場合、yには5.000・・・・の値が代入される。 その逆でdouble型の変数・定数をint型に変換することができる。 ※abs(定数); 定数の絶対値を取る。 ※sqrt(定数); 定数の平方根を取る。
解答:ls2_21.cpp
どうしてもコンパイルエラーが起きる!と言う場合、どこかで全角スペースキーが入力されていないか、文法にミス(最も多くあるのが"かぎかっこ"のつけ忘れ、セミコロン(;)の入力忘れ、領域外に認識できない文字コードが入力されている、などが挙げられる)がないか、を解答と合わせて比較していけばいい。