|
- """
- 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, color=WHITE):
- self.a = a
- self.b = b
- self.k = k
- self.length = self.compute_length() if length is None else length
- self.color = color
- print(self.length)
-
- def render(self, screen):
- x1, y1 = self.a.pos + CENTER
- x2, y2 = self.b.pos + CENTER
- pygame.draw.line(screen, self.color, [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
|