В настоящее время я прорабатываю некоторые уроки по естественному моделированию в Академии Хана и пытаюсь воспроизвести их код JavaScript в python. В приведенном ниже коде я пытаюсь симулировать гравитацию и ветер на двух разных телах разных масс. Но, хотя в методе apply_force()
я делю на массу тел, при запуске симуляции оба тела движутся с одинаковой скоростью. Ветер должен заставлять тело меньшего размера двигаться быстрее, чем тело большего размера, но это не так.
#init pygame library
import pygame
import random
pygame.init()
window_width = 800
window_height = 800
FPS = 500
screen = pygame.display.set_mode([window_width, window_height])
clock = pygame.time.Clock()
running = True
#basic vector class class
class Vector2f:
def __init__(self, x, y):
self.x = x
self.y = y
def add(self, v2):
self.x = self.x + v2.x
self.y = self.y + v2.y
def mult(self, v2):
self.x = self.x * v2.x
self.y = self.y * v2.y
#mover class
class Mover:
def __init__(self, mass, position, velocity, acceleration):
self.mass = mass
self.position = position
self.velocity = velocity
self.acceleration = acceleration
def apply_force(self, force):
f = Vector2f((force.x/float(self.mass)), (force.y/float(self.mass)))
self.acceleration.add(f)
def update(self):
self.velocity.add(self.acceleration)
self.position.add(Vector2f(self.velocity.x, self.velocity.y))
self.acceleration.mult(Vector2f(0,0))
def draw(self):
pygame.draw.circle(screen, (50, 50, 50), (int(round(self.position.x)), int(round(self.position.y))), self.mass)
def check_edges(self):
if self.position.x > window_width:
self.position.x = window_width
self.velocity.x = self.velocity.x * -1
elif self.position.x < 0:
self.position.x = 0
self.velocity.x = self.velocity.x * -1
if self.position.y > window_height:
self.velocity.y = self.velocity.y * -1
self.position.y = window_height
m_position = Vector2f(30, 30)
m_velocity = Vector2f(0, 0)
m_acceleration = Vector2f(0, 0)
m1 = Mover(30, m_position, m_velocity, m_acceleration)
m2 = Mover(5, m_position, m_velocity, m_acceleration)
#simulation loop
while running:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((255,255,255))
wind = Vector2f(.003, 0)
gravity = Vector2f(0, .005)
m1.apply_force(wind)
m1.apply_force(gravity*m1.mass)
m1.update()
m1.draw()
m1.check_edges()
m2.apply_force(wind)
m2.apply_force(gravity*m2.mass)
m2.update()
m2.draw()
m2.check_edges()
pygame.display.flip()
pygame.quit()
Более того, когда я уменьшаю массу движителя меньшего размера (m2
), скорость m1
увеличивается.