forked from Dr15Jones/PhysicsSimulator
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimulation.py
41 lines (37 loc) · 2.11 KB
/
simulation.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from kinematics import Vector, Point
class Particle(object):
def __init__(self, position:Point, velocity:Vector, mass:float):
self.position = position
self.velocity = velocity
self.mass = mass
def simulation_step(deltaT:float, previous:Particle, force:Vector ):
acceleration = force/previous.mass
newVelocity = previous.velocity+acceleration*deltaT
#take average of old and new velocity when calculating position
newPosition = previous.position+(newVelocity+previous.velocity)/2.*deltaT
return Particle(position=newPosition, velocity=newVelocity, mass=previous.mass)
if __name__ == "__main__":
import unittest
class testSimulation(unittest.TestCase):
def testAtRest(self):
start = Particle(position=Point(1,0,0), velocity=Vector(0,0,0), mass=1.0)
nextStep = simulation_step(deltaT=1, previous=start, force=Vector(0,0,0))
self.assertEqual(nextStep.position, Point(1,0,0))
self.assertEqual(nextStep.velocity, Vector(0,0,0))
def testInMotion(self):
start = Particle(position=Point(1,0,0), velocity=Vector(0,1,0), mass=1.)
nextStep = simulation_step(deltaT=1, previous=start, force=Vector(0,0,0))
self.assertEqual(nextStep.position, Point(1,1,0))
self.assertEqual(nextStep.velocity, Vector(0,1,0))
nextStep = simulation_step(deltaT=1, previous=nextStep, force=Vector(0,0,0))
self.assertEqual(nextStep.position, Point(1,2,0))
self.assertEqual(nextStep.velocity, Vector(0,1,0))
def testConstantAcceleration(self):
start = Particle(position=Point(1,0,0), velocity=Vector(0,0,0), mass=1.)
nextStep = simulation_step(deltaT=1, previous=start, force=Vector(1,0,0))
self.assertEqual(nextStep.velocity, Vector(1,0,0))
self.assertEqual(nextStep.position, Point(1.5,0,0))
nextStep = simulation_step(deltaT=1, previous=nextStep, force=Vector(1,0,0))
self.assertEqual(nextStep.velocity, Vector(2,0,0))
self.assertEqual(nextStep.position, Point(3,0,0))
unittest.main()