前回、前々回と1次元の運動をシミュレートしたが、今回は2次元に拡張して放物運動をシミュレートした。要は、水平方向を等速直線運動、鉛直方向を等加速度運動として計算すればいいということになる。等速直線運動は等加速度運動の加速度が"0"のときともいえるので、コードとしては水平、鉛直ともに等加速度運動としている。
- #include <fstream>
- #include <cstdlib>
- using namespace std;
- int main(int argc, char* argv[])
- {
- double dt = 0.0001; // 1ステップの微少時間
- double po[2] = {0.0, 400.0}; // 初期座標
- double pc[2]; // 現ステップの座標
- double pp[2]; // 1ステップ前の座標
- double vc[2]; // 現ステップの速度
- double vp[2]; // 1ステップ前の速度
- double a[2] = {0.0, -9.81}; // 加速度
- int totalStep = 100000; // 総ステップ数
- double p[2][200]; // 保存用座標
- ofstream outf("./output.txt"); //結果出力ファイル
- int count = 0;
- p[0][0] = pp[0] = po[0];
- p[1][0] = pp[1] = po[1];
- vp[0] = 30.0; // 水平方向初速
- vp[1] = 0.0; // 鉛直方向初速
- for(int i = 1; i < totalStep; i++){
- vc[0] = vp[0] + a[0] * dt;
- vc[1] = vp[1] + a[1] * dt;
- pc[0] = pp[0] + (vc[0] + vp[0]) * dt / 2;
- pc[1] = pp[1] + (vc[1] + vp[1]) * dt / 2;
- count++;
- if(count == 500){
- count = 0;
- p[0][i/500] = pc[0];
- p[1][i/500] = pc[1];
- }
- pp[0] = pc[0];
- pp[1] = pc[1];
- vp[0] = vc[0];
- vp[1] = vc[1];
- }
- for(int i = 0; i < 200; i++){
- outf << p[0][i] << endl;
- outf << p[1][i] << endl;
- }
- return EXIT_SUCCESS;
- }
各時間刻みで水平方向についてと鉛直方向について同じ計算を行っているが、水平方向の加速度は"0"なので、放物運動となる。この結果は以下のようになる。
やっぱり、まだまだ地味だ。
コメント