猫史档案馆


【Python作品分享】二维three-body 十万位【作品秀】

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


【作品展示】

center_image

 

【作品介绍】

三体模拟器,基于万有引力定律,牛顿第二定律模拟全过程。

可自主设计三体各项数据,选择保存数据(这个效果要在本地运行)。

库要求: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


回复

上一页1 页 / 共 0下一页