]> Skullheadx's Git Forge - Collision-Simulation.git/commitdiff
elastic collision with other particles
authorSkullheadx <admonty1@gmail.com>
Thu, 26 Jan 2023 17:03:45 +0000 (12:03 -0500)
committerSkullheadx <admonty1@gmail.com>
Thu, 26 Jan 2023 17:03:45 +0000 (12:03 -0500)
- added mass

collision.py
display.py
particle.py

index 7bd892c79a2d0f843f8b052a7c96a4543e137df5..3df75408771b14d01b56600a8f2e6a9a222e601c 100644 (file)
@@ -1,5 +1,33 @@
+from pygame import Vector2
 def handleBoxCollision(particle, box):  # Discrete Collision Detection
     if particle.left <= box.left or particle.right >= box.right:
         particle.velocity.x *= -1
     if particle.bottom >= box.bottom or particle.top <= box.top:
         particle.velocity.y *= -1
+
+
+def handleParticleCollision(particle1, particle2): # https://www.vobarian.com/collisions/2dcollisions2.pdf
+    if particle1.position.distance_to(particle2.position) <= particle1.radius + particle2.radius and particle1 != particle2:
+        n = particle2.position - particle1.position
+        un = n/n.magnitude()
+        ut = Vector2(-un.y, un.x)
+
+        v1 = particle1.velocity
+        v2 = particle2.velocity
+
+        v1n = un.dot(v1)
+        v1t = ut.dot(v1)
+        v2n = un.dot(v2)
+        v2t = ut.dot(v2)
+
+        v1t_prime = v1t
+        v2t_prime = v2t
+
+        v1n_prime = (v1n * (particle1.mass - particle2.mass) + 2 * particle2.mass * v2n) / (particle1.mass + particle2.mass)
+        v2n_prime = (v2n * (particle2.mass - particle1.mass) + 2 * particle1.mass * v1n) / (particle1.mass + particle2.mass)
+
+        v1_prime = v1n_prime * un + v1t_prime * ut
+        v2_prime = v2n_prime * un + v2t_prime * ut
+
+        particle1.velocity = v1_prime
+        particle2.velocity = v2_prime
\ No newline at end of file
index 77f738e3006f1af0949b2708db00a0883f78b4cc..607cffe612829997276df4c93b7c5c95029997d9 100644 (file)
@@ -1,4 +1,5 @@
 import pygame
+import random
 
 from box import Box
 from colours import *
@@ -21,10 +22,12 @@ class Display:
         pygame.display.set_caption(window_name)
 
         self.collision_objects = {layer: [] for layer in range(self.COLLISION_LAYERS)}
+        self.particles = [Particle(self.CENTER, (random.random() * 0.75, random.random() * 0.75), (0, 0), 35, 15, self.collision_objects[0]),
+                          Particle((self.WIDTH/3, self.HEIGHT/3), (random.random() * 0.75, random.random() * 0.75), (0, 0), 35, 25, self.collision_objects[0])
+                          ]
+        self.box = Box((0, 0), self.WIDTH, self.HEIGHT)
 
-        self.particles = [Particle(self.CENTER, (0, 0.5), (0, 0), 15, self.collision_objects[0])]
         self.collision_objects[0] += self.particles
-        self.box = Box((0, 0), self.WIDTH, self.HEIGHT)
         self.collision_objects[0].append(self.box)
 
     def show(self):
index 6e6f742349b0873068b71a7f4d84e880245d6e9c..45961cc94a0dd47c38d330570c05202d3775232a 100644 (file)
@@ -3,18 +3,19 @@ from math import copysign
 import pygame
 
 from box import Box
-from collision import handleBoxCollision
+from collision import handleBoxCollision, handleParticleCollision
 from colours import *
 
 
 class Particle:
     speed_limit = 3
 
-    def __init__(self, initial_position, initial_velocity, initial_acceleration, radius, collision_layer):
+    def __init__(self, initial_position, initial_velocity, initial_acceleration, radius, mass, collision_layer):
         self.position = pygame.Vector2(initial_position)
         self.velocity = pygame.Vector2(initial_velocity)
         self.acceleration = pygame.Vector2(initial_acceleration)
         self.radius = radius
+        self.mass = mass
 
         self.left = self.position.x - self.radius
         self.right = self.position.x + self.radius
@@ -48,6 +49,8 @@ class Particle:
         for thing in self.collision_layer:
             if isinstance(thing, Box):
                 handleBoxCollision(self, thing)
+            elif isinstance(thing, Particle):
+                handleParticleCollision(self, thing)
 
     def draw(self, surf):
         pygame.draw.circle(surf, RED, self.position, self.radius)