Pete Shadbolt pirms 6 gadiem
vecāks
revīzija
8427b631e3
1 mainītis faili ar 73 papildinājumiem un 0 dzēšanām
  1. +73
    -0
      verlet.py

+ 73
- 0
verlet.py Parādīt failu

@@ -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



Notiek ielāde…
Atcelt
Saglabāt