diff options
| author | Sam Anthony <sam@samanthony.xyz> | 2024-10-02 12:53:54 -0400 |
|---|---|---|
| committer | Sam Anthony <sam@samanthony.xyz> | 2024-10-02 12:53:54 -0400 |
| commit | 9ade04722dd351c3f42cd98be28fc255043b3030 (patch) | |
| tree | 3aced80bf9cc9fb4160e2fab1ad7afa2d5b45df9 /collision.cpp | |
| parent | 2c54c155c9dc92c62881998c055bce17beddbe4f (diff) | |
| download | balls-9ade04722dd351c3f42cd98be28fc255043b3030.zip | |
multiple balls
Diffstat (limited to 'collision.cpp')
| -rw-r--r-- | collision.cpp | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/collision.cpp b/collision.cpp new file mode 100644 index 0000000..1ffe957 --- /dev/null +++ b/collision.cpp @@ -0,0 +1,43 @@ +#include "balls.h" + +static double clamp(double v, double lo, double hi); +static double min(double a, double b); +static double max(double a, double b); + +int +isCollision(Point p1, double r1, Point p2, double r2) { + double dx, dy; + + dx = p1.x - p2.x; + dy = p1.y - p2.y; + return (dx*dx + dy*dy) <= (r1+r2)*(r1+r2); +} + +void +collideWall(Ball *b, Rectangle wall) { + wall = insetRect(wall, b->r); + + if (b->p.x < wall.min.x || b->p.x > wall.max.x) { + b->p.x = clamp(b->p.x, wall.min.x, wall.max.x); + b->v.x = -b->v.x; + } + if (b->p.y < wall.min.y || b->p.y > wall.max.y) { + b->p.y = clamp(b->p.y, wall.min.y, wall.max.y); + b->v.y = -b->v.y; + } +} + +static double +clamp(double v, double lo, double hi) { + return min(hi, max(v, lo)); +} + +static double +min(double a, double b) { + return (a < b) ? a : b; +} + +static double +max(double a, double b) { + return (a > b) ? a : b; +} |