本教程使用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個...