Are you sure?
Do you want to delete “physics” permanently? You will not be able to undo this action.
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.radius = 10
self.restitution = -0.7
self.circle = Circle(x=self.pos.x, y=self.pos.y, width=self.radius, height=self.radius)
def draw(self):
self.circle.x = self.pos.x
self.circle.y = self.pos.y
self.width = self.radius
self.height = self.radius
FRAMERATE = 1 / 60
Cd = 0.47
rho = 1.22
"TODO: Make part of loop"
radius = 10
A = math.pi * radius * radius / (10000)
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()