pygame教程例項(二)模擬三體

2021-09-26 01:54:06 字數 3486 閱讀 5171

本教程使用python3

我的另一篇文章pygame春節十二響

from sys import exit

import pygame, math

from pygame.color import

*g =

900# 重力常量

fps =

50# 幀率

exact =

50# 每幀計算幾次,次數越多越精確,它是動態變化的

pygame.init(

)# 初始化pygame

screen = pygame.display.set_mode(

(640

,480

), pygame.doublebuf,32)

pygame.display.set_caption(

"模擬三體"

)clock = pygame.time.clock(

)font = pygame.font.sysfont(

"arial",16

)

class

star()

: x , y =0,

0# 座標

vx, vy =0,

0# x,y方向上的速度

ax, ay =0,

0# x,y方向上的加速度

m =0# 質量

r =10# 半徑

def__init__

(self, x, y, vx, vy, m)

: self.x = x

self.y = y

self.vx = vx

self.vy = vy

self.m = m

defset_a

(self, other_star)

:'''

計算star與other_star之間的重力加速度

'''d_2 =

(self.x - other_star.x)**2

+(self.y - other_star.y)**2

_x =[-

1,1]

[self.x < other_star.x]

_y =[-

1,1]

[self.y < other_star.y]

if d_2 !=0:

a = g * self.m * other_star.m / d_2

else

: a =

0if self.x != other_star.x:

ax_ = math.sqrt(a **2/

(((self.y - other_star.y)

/(self.x - other_star.x))**

2+1)

) self.ax += ax_ * _x

self.ay += math.sqrt(a **

2- ax_ **2)

* _y

else

: self.ay += a * _y

defrun(self, time)

:'''

計算time時間後的位置

:param time:時間,秒

:return:

'''self.ax /= self.m

self.ay /= self.m

self.vx += self.ax * time

self.vy += self.ay * time

self.x += self.vx * time

self.y += self.vy * time

star_list =

dd =

0.00001

200,

300,-30

,-math.sqrt(3)

*30,1000))

400,

300,-30

, math.sqrt(3)

*30,1000))

300,

300-math.sqrt(3)

*100

+dd,60,

0,1000

))

# 計算引力加速度

defset_a

(star_list)

:for i, star in

enumerate

(star_list)

: star.ax, star.ay =0,

0for j, other_star in

enumerate

(star_list)

:if i != j:

star.set_a(other_star)

# 遊戲主迴圈

while

true

:for event in pygame.event.get():

if event.

type

== pygame.quit:

# 接收到退出時間後退出程式

exit(

)for i in

range

(exact)

: set_a(star_list)

for star in star_list:

star.run(

1/ fps / exact)

# 將背景圖畫上去

screen.fill((0

,0,0

))max_v =

0for star in star_list:

max_v =

max(max_v, math.sqrt(star.vx**

2+star.vy**2)

) pygame.draw.circle(screen,

(255,0

,0),

(int

(star.x)

,int

(star.y)

), star.r)

exact =

min(

300,

max(30,

int(max_v)))

*5screen.blit(font.render(

"fps: "

+str

(clock.get_fps())

,1, thecolors[

"white"])

,(0,

0)) screen.blit(font.render(

"exact: "

+str

(exact),1

, thecolors[

"white"])

,(0,

15))# 重新整理畫面

pygame.display.update(

) time_passed = clock.tick(fps)

unity 模擬三體運動

以乙個三體迷和碼農的身份確定一下三體問題的無解threebody demo 1.軌跡 首先在執行之前得 一下執行軌跡,修改引數得到不同的軌跡 2.三體問題的特殊解 通過維基百科鏈結到一篇相關 a remarkable periodic solution of the three body probl...

三體運動的程式模擬

前幾天看了 三體 很不錯的科幻 說到三體,我想到我大學的乙個舍友叫王晶,和香港那個導演同名同姓同性別.記得有一次幾個同學在一塊聊天,有個女生問他 父母為什麼給他取名叫晶.他說叫晶是父母希望能有三個太陽守護著他。那時我還很單純,不會用五行缺什麼的話來諷刺他,只是說,如果給他起名叫王晶晶的話,那就有6個...

三體運動的程式模擬

前幾天看了 三體 很不錯的科幻 說到三體,我想到我大學的乙個舍友叫王晶,和香港那個導演同名同姓同性別.記得有一次幾個同學在一塊聊天,有個女生問他 父母為什麼給他取名叫晶.他說叫晶是父母希望能有三個太陽守護著他。那時我還很單純,不會用五行缺什麼的話來諷刺他,只是說,如果給他起名叫王晶晶的話,那就有6個...