import pygame
pygame.init()
screen = pygame.display.set_mode((1280,720))
clock = pygame.time.Clock()
running = True
class Ball:
def __init__(self,p,v,m) -> None:
self.p = p
self.m = m
self.v = v
self.a = [0,0]
def force(self, li): #计算受力后的位置和速度,加速度
self.a[0] = li[0] / self.m
self.a[1] = li[1] / self.m
self.v[0] += self.a[0]
self.v[1] += self.a[1]
self.p[0] = self.p[0] + self.v[0]
self.p[1] = self.p[1] + self.v[1]
def set_a(self,other_star): #计算和other_star 间的引力 并且计算好受力后的状态
r_2 =(other_star.p[0]-self.p[0])**2 + (other_star.p[1]-self.p[1])**2
li_2 = (other_star.m*self.m/r_2) * 2
li = [li_2*(other_star.p[0]-self.p[0])/r_2**0.5,li_2*(other_star.p[1]-self.p[1])/r_2**0.5]
self.force(li)
def draw(self,surface:pygame.Surface): #绘制到屏幕上
pygame.draw.circle(surface,"red",(self.p[0],self.p[1]),8)
balls = []
balls_copy = []
balls.append(Ball(p = [501,480],v = [1,1.7],m = 1000))
balls.append(Ball(p = [777,480],v = [1,-1.7],m = 1000))
balls.append(Ball(p = [888,240],v = [-2,0],m = 1000))
balls_copy.append(Ball(p = [501,480],v = [1,1.7],m = 1000))
balls_copy.append(Ball(p = [777,480],v = [1,-1.7],m = 1000))
balls_copy.append(Ball(p = [888,240],v = [-2,0],m = 1000))
while running:
clock.tick(120)
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
for i, star in enumerate(balls):
for j, other_star in enumerate(balls_copy):
if i != j:
star.set_a(other_star)
balls_copy = balls
screen.fill('black')
for ball in balls:
ball.draw(screen)
pygame.display.update()
pygame.quit()
Python Pygame 三体运动 为什么距离太近了就会突然飞出去
最新推荐文章于 2024-06-03 13:31:43 发布