// 飛び込み自殺、遺体散乱検証シミュレーター

// 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);
}