#include "TrueBASIC.h" void EulerRichardson(double pos[], double vel[], double *t, double *GM, double *dt, char *kick_flag, double *xsave, double *ysave); void acceleration(double pos[], double accel[], double *GM); void EulerRichardson(double pos[], double vel[], double *t, double *GM, double *dt, char *kick_flag, double *xsave, double *ysave) { int s, i, Itmp1_; float x, y; double diffx, velmid[3], diffy, v, v2, accel[3], posmid[3], impulse; if(GWmouse(&Itmp1_, &x, &x)) s = 1; else if(Itmp1_) s = 2; else s = 3; if(s == 2) { (*xsave) = x; // マウスがクリックされた位置を記録 (*ysave) = y; strcpy(kick_flag, "on"); } if((strcmp(kick_flag, "on") == 0)) { diffx = fabs(pos[1] - (*xsave)); diffy = fabs(pos[2] - (*ysave)); // マウスがクリックされた位置に衛星が達するまで待つ if((diffx < 0.02) && (diffy < 0.02)) { v2 = vel[1]*vel[1] + vel[2]*vel[2]; v = sqrt(v2); impulse = 0.1*v; // 衝撃力/質量 の大きさ vel[2] = vel[2] + impulse; // 鉛直方向にキック strcpy(kick_flag, "off"); } } // 各時間区間の初めで加速度を計算 acceleration(pos, accel, GM); for(i = 1; i <= 2; ++i) { velmid[i] = vel[i] + 0.5*accel[i]*(*dt); posmid[i] = pos[i] + 0.5*vel[i]*(*dt); } // 各時間区間の中央で加速度を計算 acceleration(posmid, accel, GM); // 各時間区間の終わりで位置と速度を計算 for(i = 1; i <= 2; ++i) { vel[i] += accel[i]*(*dt); pos[i] += velmid[i]*(*dt); } (*t) += (*dt); }