From 8427b631e38567340818e4cd29dcfdfff63ae564 Mon Sep 17 00:00:00 2001 From: Pete Shadbolt Date: Mon, 8 Oct 2018 10:09:27 -0700 Subject: [PATCH] Messy --- verlet.py | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 verlet.py diff --git a/verlet.py b/verlet.py new file mode 100644 index 0000000..73c554b --- /dev/null +++ b/verlet.py @@ -0,0 +1,73 @@ +""" +Implements Verlet integration +""" + +import pygame +import numpy as np + +SIZE = (800, 800) +CENTER = np.array(SIZE) / 2 +WHITE = (255, 255, 255) +DAMPING = 0.99 + + +class Ball(object): + def __init__(self, x, y, radius=5, mass=1, fixed=False): + self.pos = np.array([x, y]) + self.last_pos = np.array([x, y]) + self.velocity = np.array([0., 0.]) + self.radius = radius + self.mass = mass + self.fixed = fixed + + def render(self, screen): + x, y = self.pos + CENTER + pygame.draw.circle(screen, WHITE, [int(x), int(y)], self.radius, 4) + + def update(self): + if self.fixed: + return + + # Gravity + #self.pos[1] += .05 + + # Bounce + if self.pos[1] > 400: + self.pos[1] = 400 + self.last_pos[1] = 400 + self.velocity[1] = -.5 * self.velocity[1] + + self.pos += self.velocity + + self.velocity = self.pos - self.last_pos + self.velocity *= DAMPING + self.last_pos = np.array(self.pos) + + +class Spring(object): + def __init__(self, a, b, length=None, k=0.3): + self.a = a + self.b = b + self.k = k + self.length = self.compute_length() if length is None else length + print(self.length) + + def render(self, screen): + x1, y1 = self.a.pos + CENTER + x2, y2 = self.b.pos + CENTER + pygame.draw.line(screen, WHITE, [x1, y1], [x2, y2]) + + def compute_length(self): + x1, y1 = self.a.pos + CENTER + x2, y2 = self.b.pos + CENTER + return np.sqrt((x2 - x1)**2 + (y2 - y1)**2) + + def update(self): + current_length = self.compute_length() + delta = self.b.pos - self.a.pos + delta /= current_length + stretch = (current_length - self.length) / self.length + self.a.velocity += stretch * delta * self.k + self.b.velocity -= stretch * delta * self.k + +