```import math
from random import randint

class Vec2D:
def __init__(self, x=50, y=50):
self.x = x
self.y = y

class Entity:
def __init__(self, x = 0, y = 50, vx = 0.5, vy = 0, mass = 0.1):
self.pos = Vec2D(x, y)
self.vel = Vec2D(vx, vy)
self.mass = mass
self.restitution = -0.7
def draw(self):
self.circle.x = self.pos.x
self.circle.y = self.pos.y

FRAMERATE  = 1 / 60

Cd = 0.47
rho = 1.22
"TODO: Make part of loop"

ag = 9.81

def gravity(entity):
"TODO: Make this not awful"
if entity.vel.x == 0:
entity.vel.x += pow(0.1, 0.1)
if entity.vel.y == 0:
entity.vel.y = pow(0.1, 0.1)

Fx = -0.5 * Cd * A * rho * entity.vel.x * entity.vel.x * entity.vel.x / abs(entity.vel.x)
Fy = -0.5 * Cd * A * rho * entity.vel.y * entity.vel.y * entity.vel.y / abs(entity.vel.y)

if math.isnan(Fx):
Fx = 0

if math.isnan(Fy):
Fy = 0

ax = Fx / entity.mass
ay = ag + (Fy / entity.mass)

entity.vel.x += ax * FRAMERATE
entity.vel.y += ay * FRAMERATE

entity.pos.x += entity.vel.x * FRAMERATE * 100
entity.pos.y += entity.vel.y * FRAMERATE * 100
return entity

def collision(entity, entities):
if entity.pos.y > 100 - entity.radius / 2:
entity.pos.y = 100 - entity.radius / 2
entity.vel.y *= entity.restitution
return entity

entities = [Entity(), Entity(randint(10, 90), randint(0, 90), randint(-1, -1), randint(-1, -1))]
for i in range(175):
with animation(FRAMERATE / 2):
for entity in entities:
gravity(entity)
collision(entity, entities)
entity.draw()```

# physics

by brecert

Created 1 year, 8 months ago.