/* movie.c inertia, gravity, bouncing */ #include "rtd.h" #include double dot(); float tx43; #define cube(a) ((tx43=a)*(tx43)*(tx43)) #define density 1.0 movie(bl, nob, step, Step, gravity, bounce, attraction) struct ball *bl; int nob, step, Step, bounce; float gravity, attraction; { register int i, j; register struct ball *bli, *blj; struct vector f; for (step = 0; steps.cent, &blj->s.cent); vecl(&d); if (d.l <= bli->s.rad + blj->s.rad) { tmp = bli->s.rad; massi = tmp*tmp*tmp; tmp = blj->s.rad; massj = tmp*tmp*tmp; fi = massi/(massi+massj); fj = massj/(massi+massj); cmv.x = fi*bli->v.x + fj*blj->v.x; cmv.y = fi*bli->v.y + fj*blj->v.y; cmv.z = fi*bli->v.z + fj*blj->v.z; /* rvi = bli->v - cmv */ sv(&rvi, &bli->v, &cmv); tmp = dot(&d,&rvi); /* d = 2*|d.rvi|/|d.d|*d */ scamult(2.0*tmp/(d.l*d.l),&d); /* bli->v = d - rvi + cmv */ sv(&rvi, &rvi,&d); av(&bli->v, &cmv, &rvi); vecl(&d); sv(&rvj, &blj->v, &cmv); tmp = dot(&d,&rvj); scamult(2.0*tmp/(d.l*d.l),&d); sv(&rvj, &rvj,&d); av(&blj->v, &cmv, &rvj); } } if (attraction != 0.0) { register float dl, tmp; struct vector d; f.x = f.y = f.z = 0.0; for (j=0, blj=bl; js.cent, &blj->s.cent); dl = sqrt(d.x*d.x + d.y*d.y + d.z*d.z); tmp = blj->s.rad/dl; tmp=tmp*tmp*tmp; scamult(tmp, &d); /* mass/(r*r) */ av(&f, &f, &d); } scamult(attraction/(density*Step), &f); sv(&bli->v, &bli->v, &f); } } for (i=0, bli=bl; is.cent.x += bli->v.x/Step; bli->v.y -= gravity; bli->s.cent.y += bli->v.y/Step; if (bli->s.cent.y < bli->s.rad && bli->v.y < 0) bli->v.y = - bli->v.y; bli->s.cent.z += bli->v.z/Step; if (bli->s.cent.z < bli->s.rad && bli->v.z < 0) bli->v.z = - bli->v.z; } } }