From b57dba67153279a84a16bba40ae007c8ae710056 Mon Sep 17 00:00:00 2001 From: rodri Date: Thu, 29 Jul 2021 20:03:15 +0000 Subject: incorporated libgeometry into the project. transitioned the integrator from scalar to vector-based. added a packing procedure for Point2. created the structure to model bullets. --- physics.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-) (limited to 'physics.c') diff --git a/physics.c b/physics.c index d0c6ae8..945ff8c 100644 --- a/physics.c +++ b/physics.c @@ -1,6 +1,7 @@ #include #include -#include /* because of dat.h */ +#include +#include "libgeometry/geometry.h" #include "dat.h" #include "fns.h" @@ -9,12 +10,12 @@ static double G = 6.674e-11; /* * Dynamics stepper */ -static double +static Point2 accel(GameState *s, double) { static double k = 15, b = 0.1; - return -k*s->x - b*s->v; + return Vec2(0, -k*s->p.y - b*s->v.y); } static Derivative @@ -23,8 +24,8 @@ eval(GameState *s0, double t, double Δt, Derivative *d) GameState s; Derivative res; - s.x = s0->x + d->dx*Δt; - s.v = s0->v + d->dv*Δt; + s.p = addpt2(s0->p, mulpt2(d->dx, Δt)); + s.v = addpt2(s0->v, mulpt2(d->dv, Δt)); res.dx = s.v; res.dv = accel(&s, t+Δt); @@ -37,13 +38,13 @@ eval(GameState *s0, double t, double Δt, Derivative *d) static void euler0(GameState *s, double t, double Δt) { - static Derivative ZD = {0,0}; + static Derivative ZD = {0}; Derivative d; d = eval(s, t, Δt, &ZD); - s->x += d.dx*Δt; - s->v += d.dv*Δt; + s->p = addpt2(s->p, mulpt2(d.dx, Δt)); + s->v = addpt2(s->v, mulpt2(d.dv, Δt)); } /* @@ -52,13 +53,13 @@ euler0(GameState *s, double t, double Δt) static void euler1(GameState *s, double t, double Δt) { - static Derivative ZD = {0,0}; + static Derivative ZD = {0}; Derivative d; d = eval(s, t, Δt, &ZD); - s->v += d.dv*Δt; - s->x += s->v*Δt; + s->v = addpt2(s->v, mulpt2(d.dv, Δt)); + s->p = addpt2(s->p, mulpt2(s->v, Δt)); } /* @@ -67,20 +68,20 @@ euler1(GameState *s, double t, double Δt) static void rk4(GameState *s, double t, double Δt) { - static Derivative ZD = {0,0}; + static Derivative ZD = {0}; Derivative a, b, c, d; - double dxdt, dvdt; + Point2 dxdt, dvdt; a = eval(s, t, 0, &ZD); b = eval(s, t, Δt/2, &a); c = eval(s, t, Δt/2, &b); d = eval(s, t, Δt, &c); - dxdt = 1.0/6 * (a.dx + 2*(b.dx + c.dx) + d.dx); - dvdt = 1.0/6 * (a.dv + 2*(b.dv + c.dv) + d.dv); + dxdt = divpt2(addpt2(addpt2(a.dx, mulpt2(addpt2(b.dx, c.dx), 2)), d.dx), 6); + dvdt = divpt2(addpt2(addpt2(a.dv, mulpt2(addpt2(b.dv, c.dv), 2)), d.dv), 6); - s->x += dxdt*Δt; - s->v += dvdt*Δt; + s->p = addpt2(s->p, mulpt2(dxdt, Δt)); + s->v = addpt2(s->v, mulpt2(dvdt, Δt)); } /* -- cgit v1.2.3