Python Pygame 三体运动 为什么距离太近了就会突然飞出去

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()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值