用户:
蓝色De绿巨人_半退站查看:0 回复:0 评论:0 创建时间:2022-01-02T12:12:51
【作品展示】

【作品介绍】
三体模拟器,基于万有引力定律,牛顿第二定律模拟全过程。可自主设计三体各项数据,选择保存数据(这个效果要在本地运行)。
库要求:turtle
注:万有引力常数设置的越大,运行越快,但越不精确,反之亦然。
BUG:恒星距离太近会飙出去,懒得更了。
谢啦!!☆⌒(*^-゜)v
【作品源代码】
try:
import turtle
# 参数保存许可
most_important_is_save = True
# 宇宙坐标系、万有引力常数
myscreen = turtle.Screen()
myscreen.setworldcoordinates(0, 0, 800, 800)
turtle.bgcolor()
G = turtle.numinput('参数模块', '输入万有引力常数(推荐值2)')
# 三体生成
a = turtle.Pen()
a.shape('circle')
a.fillcolor('red')
a.pencolor('red')
a.speed(0)
a.pensize(5)
b = turtle.Pen()
b.shape('circle')
b.fillcolor('blue')
b.pencolor('blue')
b.speed(0)
b.pensize(5)
c = turtle.Pen()
c.shape('circle')
c.fillcolor('green')
c.pencolor('green')
c.speed(0)
c.pensize(5)
# 三体初位置
xa = turtle.numinput('参数模块', '输入红色星初始横坐标')
ya = turtle.numinput('参数模块', '输入红色星初始纵坐标')
xb = turtle.numinput('参数模块', '输入蓝色星初始横坐标')
yb = turtle.numinput('参数模块', '输入蓝色星初始纵坐标')
xc = turtle.numinput('参数模块', '输入绿色星初始横坐标')
yc = turtle.numinput('参数模块', '输入绿色星初始纵坐标')
# 记录
rexa = xa
reya = ya
rexb = xb
reyb = yb
rexc = xc
reyc = yc
# 格式
a.penup()
b.penup()
c.penup()
a.goto(xa, ya)
b.goto(xb, yb)
c.goto(xc, yc)
a.pendown()
b.pendown()
c.pendown()
# 三体初速度(横,纵)
vax = turtle.numinput('参数模块', '输入红色星初始横向速度')
vay = turtle.numinput('参数模块', '输入红色星初始纵向速度')
vbx = turtle.numinput('参数模块', '输入蓝色星初始横向速度')
vby = turtle.numinput('参数模块', '输入蓝色星初始纵向速度')
vcx = turtle.numinput('参数模块', '输入绿色星初始横向速度')
vcy = turtle.numinput('参数模块', '输入绿色星初始纵向速度')
# 记录
revax = vax
revay = vay
revbx = vbx
revby = vby
revcx = vcx
revcy = vcy
# 三体质量、大小
ma = turtle.numinput('参数模块', '输入红色星质量')
a.shapesize(ma+0.000001)
mb = turtle.numinput('参数模块', '输入蓝色星质量')
b.shapesize(mb+0.000001)
mc = turtle.numinput('参数模块', '输入绿色星质量')
c.shapesize(mc+0.000001)
# 记录
rema = ma
remb = mb
remc = mc
# 计算
times = 100000
for time in range(times):
# 碰撞
if (xa == xb and ya == yb) or (xa == xc and ya == yc) or (xb == xc and yb == yc):
print('发生内核碰撞,星系稳定了。')
break
# 距离公式
dab = ((xa-xb)**2+(ya-yb)**2)**0.5
dac = ((xa-xc)**2+(ya-yc)**2)**0.5
dbc = ((xb-xc)**2+(yb-yc)**2)**0.5
# a路径
aab = G*mb/(dab**2) # 物体b对物体a的加速度
aac = G*mc/(dac**2) # 物体c对物体a的加速度
aax = aab*(xb-xa)/dab + aac*(xc-xa)/dac # 物体a受到的水平加速度
aay = aab*(yb-ya)/dab + aac*(yc-ya)/dac # 物体a受到的垂直加速度
vax = vax + aax # 物体a的水平速度
vay = vay + aay # 物体a的垂直速度
xa = xa + vax # 物体a的水平位置
ya = ya + vay # 物体a的垂直位置
a.goto(xa, ya)
# b路径
aba = G*ma/(dab**2) # 物体a对物体b的加速度
abc = G*mc/(dbc**2) # 物体c对物体b的加速度
abx = aba*(xa-xb)/dab + abc*(xc-xb)/dbc # 物体b受到的水平加速度
aby = aba*(ya-yb)/dab + abc*(yc-yb)/dbc # 物体b受到的垂直加速度
vbx = vbx + abx # 物体b的水平速度
vby = vby + aby # 物体b的垂直速度
xb = xb + vbx # 物体b的水平位置
yb = yb + vby # 物体b的垂直位置
b.goto(xb, yb)
# c路径
aca = G*ma/(dac**2) # 物体a对物体c的加速度
acb = G*mb/(dbc**2) # 物体b对物体c的加速度
acx = aca*(xa-xc)/dac + acb*(xb-xc)/dbc # 物体c受到的水平加速度
acy = aca*(ya-yc)/dac + abc*(yb-yc)/dbc # 物体c受到的垂直加速度
vcx = vcx + acx # 物体c的水平速度
vcy = vcy + acy # 物体c的垂直速度
xc = xc + vcx # 物体c的水平位置
yc = yc + vcy # 物体c的垂直位置
c.goto(xc, yc)
turtle.done()
except TypeError:
print('参数有误,请输入合法数值!')
most_important_is_save = False
except:
print('程序已中止。')
if most_important_is_save:
is_save = input('是否保存参数?如要保存,请输入“1”+回车,否则系统将不保存此次运行参数。')
if is_save == '1':
with open('three-body运行记录.txt', 'a')as f:
f.write('万有引力常数:'+str(G)+'\n')
f.write('红色星初始坐标:'+str(rexa)+' , '+str(reya)+'\n')
f.write('蓝色星初始坐标:'+str(rexb)+' , '+str(reyb)+'\n')
f.write('绿色星初始坐标:'+str(rexc)+' , '+str(reyc)+'\n')
f.write('红色星初始速度:'+str(revax)+' , '+str(revay)+'\n')
f.write('蓝色星初始速度:'+str(revbx)+' , '+str(revby)+'\n')
f.write('绿色星初始速度:'+str(revcx)+' , '+str(revcy)+'\n')
f.write('红色星质量:'+str(rema)+'\n')
f.write('蓝色星质量:'+str(remb)+'\n')
f.write('绿色星质量:'+str(remc)+'\n')
f.write('\n')
print('参数已保存到该程序目录下。')
else:
print('您已取消保存。')
else:
print('传入参数无意义,无法保存。')
【提示】
部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:
https://python.codemao.cn