// 飛び込み自殺、遺体散乱検証シミュレーター
// gcc -g scrap.cpp -o scrap
#include <stdio.h>
#include <stdlib.h>
// 江バ電の構造体
typedef struct train
{
double time; // 経過時間
double acceleration; // 加速度(減速方向)
double init_speed; // t=0の時の速度
double init_location; // t=0の時の車両の先頭位置 (x=0.0)
double head_location; // 車両の先頭位置
double speed; // 車両の速度
// 実際は8両構成なので、32組の車輪あるべきなのだが
// 実際に全部の車輪が使われる前に電車が止まるので、16にしてある(追加しても良い)
double wheel_location[16]; // 車輪の数(両輪一組で1個とカウント)
} TRAIN;
// 人体の構造体
typedef struct body
{
double speed; // 人体の移動速度
double location; // 人体(のパーツ)の中で、もっとも遠くにあるもの
double friction_factor; // 地面(枕木とか砂利とか)による減衰定数
} BODY;
int main ()
{
TRAIN train;
train.time = 0.0;
train.head_location = 0.0;
train.acceleration = -1.39;
train.speed = train.init_speed = 13.888;
// 1両目
train.wheel_location[0] = 2.0; // 列車先頭からの距離
train.wheel_location[1] = 4.0;
train.wheel_location[2] = 16.0;
train.wheel_location[3] = 18.0;
// 2両目
train.wheel_location[4] = 22.0;
train.wheel_location[5] = 24.0;
train.wheel_location[6] = 36.0;
train.wheel_location[7] = 38.0;
// 3両目
train.wheel_location[8] = 42.0;
train.wheel_location[9] = 44.0;
train.wheel_location[10] = 56.0;
train.wheel_location[11] = 58.0;
// 4両目
train.wheel_location[12] = 62.0;
train.wheel_location[13] = 64.0;
train.wheel_location[14] = 76.0;
train.wheel_location[15] = 78.0;
BODY body;
body.location = 0.0;
body.speed = 0.0;
body.friction_factor = 0.02; // ここは適当に決めた
int wheel_count = 0;
// 刻み時間は0.01秒とした (以下"0.01"とハードコードしてあるものは刻み時間)
while (train.speed > 0.0){
// 画面確認用
//printf("time = %f, speed = %f, location= %f, wheel_loc[4] = %f\n",
// train.time, train.speed, train.head_location, train.wheel_location[4]);
// エクセルファイル(csv)用
printf("%f,%f,%f,",
train.time, train.speed, train.head_location);
train.time += 0.01;
train.speed += train.acceleration * 0.01;
train.head_location -= train.speed *0.01;
//
for (int i=0; i<16; i++){
train.wheel_location[i] -= train.speed *0.01;
}
if (train.wheel_location[wheel_count] < body.location){ // wheel_countの車輪がキックした
// どの車輪が、肉塊を轢断したかを確認する
//printf("Hit %d wheel\n",wheel_count);
wheel_count += 1; // 次の車輪にターゲットを移動
//肉塊の移動速度は、電車の速度に強制的に初期化
body.speed = train.speed;
}
if (body.speed > 0){ // 肉塊が停止していなければ
// 摩擦係数で、徐々に速度を落していく
body.speed -= body.friction_factor * body.speed;
body.location -= body.speed * 0.01;
}
// 画面確認用
//printf("body.speed = %f, body.location = %f\n", body.speed,body.location);
// エクセルファイル(csv)用
printf("%f,%f\n", body.speed,body.location);
}
//printf("time = %f, speed = %f, location= %f\n",train.time,train.speed, train.head_location);
}