From 26ce765feb702c6d40f89a8cf50274869cdc35b4 Mon Sep 17 00:00:00 2001 From: Sam Anthony Date: Wed, 2 Oct 2024 16:19:30 -0400 Subject: ball collisions --- collision.cpp | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'collision.cpp') diff --git a/collision.cpp b/collision.cpp index 1ffe957..5f0725e 100644 --- a/collision.cpp +++ b/collision.cpp @@ -27,6 +27,34 @@ collideWall(Ball *b, Rectangle wall) { } } +void +collideBall(Ball *b1, Ball *b2) { + Point midpt; + Vector n, distv; + double mrat, coef; + + if (!isCollision(b1->p, b1->r, b2->p, b2->r)) + return; + + /* set position of collision */ + midpt = ptDivS(addPt(b1->p, b2->p), 2); + n = unitNorm(VecPt(b1->p, b2->p)); + b1->p = ptSubVec(midpt, vecMulS(n, b1->r)); + b2->p = ptAddVec(midpt, vecMulS(n, b2->r)); + + /* reaction velocity */ + + mrat = 2.0 * b2->m / (b1->m + b2->m); + distv = VecPt(b2->p, b1->p); + coef = vecDot(subVec(b1->v, b2->v), distv) / (vecLen(distv)*vecLen(distv)); + b1->v = subVec(b1->v, vecMulS(distv, mrat*coef)); + + mrat = 2.0 * b1->m / (b1->m + b2->m); + distv = VecPt(b1->p, b2->p); + coef = vecDot(subVec(b2->v, b1->v), distv) / (vecLen(distv)*vecLen(distv)); + b2->v = subVec(b2->v, vecMulS(distv, mrat*coef)); +} + static double clamp(double v, double lo, double hi) { return min(hi, max(v, lo)); -- cgit v1.2.3