40 lines
1.4 KiB
Python
40 lines
1.4 KiB
Python
from math import hypot
|
|
|
|
|
|
class GasSim:
|
|
def __init__(self, particle_radius, particle_compressibility, particle_friction, substeps, window_aspect):
|
|
self.particle_radius = particle_radius
|
|
self.particle_compressibility = particle_compressibility
|
|
self.particle_friction = particle_friction
|
|
self.substeps = substeps
|
|
|
|
self.window_aspect = window_aspect
|
|
|
|
self.particles = []
|
|
|
|
def add_particle(self, pos, vel = [0, 0]):
|
|
self.particles.append([list(pos).copy(), vel.copy()])
|
|
|
|
def circle_particle_collide_test(self, pos, radius):
|
|
for particle in self.particles:
|
|
if hypot(particle[0][0] - pos[0], particle[0][1] - pos[1]) <= radius + self.particle_radius:
|
|
return True
|
|
|
|
def circle_force(self, pos, radius, vector, dt):
|
|
for i, particle in enumerate(self.particles):
|
|
if hypot(particle[0][0] - pos[0], particle[0][1] - pos[1]) <= radius + self.particle_radius:
|
|
self.particles[i][1][0] += vector[0] * dt
|
|
self.particles[i][1][1] += vector[1] * dt
|
|
|
|
def update(self, dt):
|
|
# substeps
|
|
for _ in range(self.substeps):
|
|
# update particles
|
|
for i, particle in enumerate(self.particles):
|
|
|
|
#
|
|
|
|
|
|
# position
|
|
self.particles[i][0][0] += particle[1][0] * dt / self.substeps
|
|
self.particles[i][0][1] += particle[1][1] * dt / self.substeps |