#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; // save position where mouse clicked (*ysave) = y; strcpy(kick_flag, "on"); } if((strcmp(kick_flag, "on") == 0)) { diffx = fabs(pos[1] - (*xsave)); diffy = fabs(pos[2] - (*ysave)); // wait until orbit reaches point where mouse clicked if((diffx < 0.02) && (diffy < 0.02)) { v2 = vel[1]*vel[1] + vel[2]*vel[2]; v = sqrt(v2); impulse = 0.1*v; // magnitude of impulse/mass vel[2] = vel[2] + impulse; // vertical kick strcpy(kick_flag, "off"); } } // compute acceleration at beginning of interval 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); } // compute acceleration at middle of interval acceleration(posmid, accel, GM); // position and velocity at end of interval for(i = 1; i <= 2; ++i) { vel[i] += accel[i]*(*dt); pos[i] += velmid[i]*(*dt); } (*t) += (*dt); }