From d55babb7820a24531ff74765ba5e06f9a476efd5 Mon Sep 17 00:00:00 2001 From: the lemons Date: Mon, 24 Apr 2023 19:42:13 -0500 Subject: mostly functional obj:avel_to_accel --- obj.lua | 38 ++++++++++++++++---------------------- objects/x.lua | 8 ++++---- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/obj.lua b/obj.lua index 5fa4c0e..42bb2c2 100644 --- a/obj.lua +++ b/obj.lua @@ -5,6 +5,7 @@ local pi = math.pi local obj = {} obj.max_size = 20 +obj.mass = 1 local types = {} function obj.load_types() @@ -152,11 +153,12 @@ function obj:tick(...) self.data.pos[1] - math.cos(angle) * dist + dx, self.data.pos[2] - math.sin(angle) * dist + dy) - local av1, av2 = self.data.avel, o.data.avel - -- transfer angular velocity conserving energy - local avel = math.sqrt((av1*av1 + av2*av2) / 2) - self.data.avel = avel * (av1 > av2 and 1 or -1) - o.data.avel = avel * (av1 > av2 and -1 or 1) + local av1, av2 = + math.abs(self.data.avel), math.abs(o.data.avel) + self.data.avel = ((av1 + av2) / 2) * + (self.data.avel >= 0 and 1 or -1) + o.data.avel = ((av1 + av2) / 2) * + (o.data.avel >= 0 and 1 or -1) local vx, vy = unpack(self.data.vel) local ovx, ovy = unpack(o.data.vel) @@ -199,11 +201,7 @@ end function obj:energy() local vx, vy = unpack(self.data.vel) local avel = self.data.avel - return 1 + avel*avel + vx*vx + vy*vy -end - -function obj:observe_avel(o) - return o.data.avel - util.magnitude(self.data.vel) + return self.mass + self.mass * (math.abs(avel) + vx^2 + vy^2) end function obj:observe_vel(o) @@ -219,21 +217,17 @@ function obj:observe_pos(o) end function obj:avel_to_accel(o, ax, ay) - local ovx, ovy = self:observe_vel(o) + local vx, vy = unpack(self.data.vel) + local ovx, ovy = unpack(o.data.vel) local nvx, nvy = ovx + ax, ovy + ay - local v = util.magnitude{ovx, ovy} - local nv = util.magnitude{nvx, nvy} - local ne = v*v - nv*nv - local avel = self:observe_avel(o) - local ave = avel*avel + ne + local energy = (ovx^2 + ovy^2) - (nvx^2 + nvy^2) + local avel = o.data.avel + local ave = math.abs(avel) + energy if ave < 0 then - return false + -- ??? end - local vx, vy = unpack(self.data.vel) - o.data.avel = - util.magnitude{vx, vy} + (math.sqrt(ave) * (avel >= 0 and 1 or -1)) - o.data.vel = {vx + nvx, vy + nvy} - return true + o.data.avel = ave * (avel >= 0 and 1 or -1) + o.data.vel[1], o.data.vel[2] = nvx, nvy end function obj:in_hitbox(px, py) diff --git a/objects/x.lua b/objects/x.lua index 080887b..5f37a7a 100644 --- a/objects/x.lua +++ b/objects/x.lua @@ -5,10 +5,10 @@ local x_obj = {hitbox = 4} function x_obj:draw() set_color(0.5, 1, 0.8) - line(-4, 2, 0, 0, -2, 4, -4, 2) - line(0, 0, 2, 4, 4, 2, 0, 0) - line(0, 0, 4, -2, 2, -4, 0, 0) - line(0, 0, -2, -4, -4, -2, 0, 0) + line(-1, 4, -3, 3, -4, 1, 0, 0, -1, 4) + line(0, 0, 1, 4, 3, 3, 4, 1, 0, 0) + line(0, 0, 4, -1, 3, -3, 1, -4, 0, 0) + line(0, 0, -1, -4, -3, -3, -4, -1, 0, 0) end local range = 40 -- cgit v1.2.3