def physicsStep(self, entity): force = Vector() if not isinstance(self.root, Sprite): stack = [self.root] while len(stack) > 0: curr = stack.pop() d = curr.size/Vector.Distance(curr.center_of_mass, entity.pos) if d < THETA: force += QuadTree.calc_force(curr.center_of_mass, entity.pos, curr.total_mass, entity.mass) else: for c in curr.children.values(): if c is None or c is entity: continue elif isinstance(c, Sprite): force += QuadTree.calc_force(c.pos, entity.pos, c.mass, entity.mass) else: stack.append(c) entity.pos = entity.pos + entity.vel * DT entity.vel = entity.vel + (force / entity.mass) * DT if Vector.Length(entity.vel) > SPEED_LIMIT: entity.vel *= OVERSPEED_DAMP else: entity.vel *= NORMAL_DAMP
def calc_force(pos1, pos2, mass1, mass2): force = (pos1 - pos2) / Vector.Distance(pos1, pos2)**3 force *= mass1*mass2 * G return force
def BruteForceCircles(self, group): for a, b in combinations(group, 2): collided = Vector.Distance(a.pos, b.pos) < (a.rad + b.rad) if collided: physics.collide(a, b)