鱼C论坛

 找回密码
 立即注册
查看: 3949|回复: 21

[作品展示] 第一次用Turtle绘图,做了个简单的小玩意

[复制链接]
发表于 2023-2-18 14:28:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 额外减小 于 2023-2-18 14:58 编辑

如题
演绎三体运动的程序
效果:
1111.JPG
代码:
import turtle
import math as ma

#
tstep=0.002
#
def _angle(z):
    if z.real>0:
        return ma.atan(z.imag/z.real)
    elif z.real<0:
        return ma.atan(z.imag/z.real)+ma.pi
    else:
        if z.imag>=0:
            return ma.pi/2
        else:
            return -ma.pi/2

#参数列表
mlist=[5000,10000,5000]
rlist=[0-30j,-20+10j,10+20j]
vlist=[20+0j,-10+5j,10+0j]
t_0,t_1,t_2=turtle.Turtle(),turtle.Turtle(),turtle.Turtle()
G=0.1
#

t_0.up()
t_1.up()
t_2.up()
#color
t_0.color("red")
t_1.color("green")
t_2.color("blue")
#
t_0.goto(rlist[0].real,rlist[0].imag)
t_1.goto(rlist[1].real,rlist[1].imag)
t_2.goto(rlist[2].real,rlist[2].imag)
t_0.down()
t_1.down()
t_2.down()

def F(a,b):
    return G*mlist[a]*mlist[b]/abs(rlist[a]-rlist[b])*ma.cos(_angle(rlist[b]-rlist[a]))+G*mlist[a]*mlist[b]/abs(rlist[a]-rlist[b])*ma.sin(_angle(rlist[b]-rlist[a]))*1j

while True:
    for i in range(5):
        vlist[0]+=(F(0,1)+F(0,2))/mlist[0]*tstep
        vlist[1]+=(F(1,0)+F(1,2))/mlist[1]*tstep
        vlist[2]+=(F(2,0)+F(2,1))/mlist[2]*tstep
        rlist[0]+=vlist[0]*tstep
        rlist[1]+=vlist[1]*tstep
        rlist[2]+=vlist[2]*tstep
    
    t_0.goto(rlist[0].real,rlist[0].imag)
    t_1.goto(rlist[1].real,rlist[1].imag)
    t_2.goto(rlist[2].real,rlist[2].imag)

评分

参与人数 1荣誉 +1 收起 理由
Threebody1 + 1 升级

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-2-18 14:31:54 | 显示全部楼层
好厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-18 14:57:15 | 显示全部楼层
本帖最后由 额外减小 于 2023-2-18 15:00 编辑

可更改参数:
line 5 : 每次演绎间隔时间
line 19: 三个质点的质量
line 20: 三个质点的初始位矢
line 21: 三个质点的初始速度矢量
line 23: 万有引力常量
line 30-32: turtle 的 颜色
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-18 15:58:51 | 显示全部楼层

                               
登录/注册后可看大图

哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-18 17:27:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-18 20:26:34 | 显示全部楼层

像极了题目不会做的时候我抓头皮屑的路线
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-18 20:31:37 | 显示全部楼层
歌者文明清理员 发表于 2023-2-18 20:26
像极了题目不会做的时候我抓头皮屑的路线

哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-18 21:30:03 | 显示全部楼层
111.JPG
绿色星球想掺和到红色和蓝色星球的紧密联系中
奈何质量太小,无足轻重,只能紧随其后
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2023-2-19 07:53:52 | 显示全部楼层
额外减小 发表于 2023-2-18 21:30
绿色星球想掺和到红色和蓝色星球的紧密联系中
奈何质量太小,无足轻重,只能紧随其后

这,万一球跑到右边了,可以设置按下某个键移动视角吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-19 08:20:13 | 显示全部楼层
等质二体+行星
import turtle
import math as ma
import random as random
#
tstep=0.02
#
def _angle(z):
    if z.real>0:
        return ma.atan(z.imag/z.real)
    elif z.real<0:
        return ma.atan(z.imag/z.real)+ma.pi
    else:
        if z.imag>=0:
            return ma.pi/2
        else:
            return -ma.pi/2

def rand():return complex(random.uniform(-25, 25), random.uniform(-25, 25))
#参数列表
mlist=[5000,5000,0.00001]
rlist=[50+0j, -50+0j, 0+0j]
vlist=[0-16j]
vlist.insert(1, -vlist[0])
vlist.append(vlist[0]+(0+10j))
t_0,t_1,t_2=turtle.Turtle(),turtle.Turtle(),turtle.Turtle()
G=0.1
#

t_0.up()
t_1.up()
t_2.up()
#color
t_0.pencolor("red")
t_1.pencolor("green")
t_2.pencolor("blue")
t_0.fillcolor('yellow')
t_1.fillcolor('cyan')
t_2.fillcolor('orange')
#
t_0.goto(rlist[0].real,rlist[0].imag)
t_1.goto(rlist[1].real,rlist[1].imag)
t_2.goto(rlist[2].real,rlist[2].imag)
t_0.down()
t_1.down()
t_2.down()

def F(a,b):
    return G*mlist[a]*mlist[b]/abs(rlist[a]-rlist[b])*ma.cos(_angle(rlist[b]-rlist[a]))+G*mlist[a]*mlist[b]/abs(rlist[a]-rlist[b])*ma.sin(_angle(rlist[b]-rlist[a]))*1j

while True:
    for i in range(5):
        vlist[0]+=(F(0,1)+F(0,2))/mlist[0]*tstep
        vlist[1]+=(F(1,0)+F(1,2))/mlist[1]*tstep
        vlist[2]+=(F(2,0)+F(2,1))/mlist[2]*tstep
        rlist[0]+=vlist[0]*tstep
        rlist[1]+=vlist[1]*tstep
        rlist[2]+=vlist[2]*tstep
    
    t_0.goto(rlist[0].real,rlist[0].imag)
    t_1.goto(rlist[1].real,rlist[1].imag)
    t_2.goto(rlist[2].real,rlist[2].imag)

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
额外减小 + 1 + 1

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-19 11:30:15 | 显示全部楼层
歌者文明清理员 发表于 2023-2-19 07:53
这,万一球跑到右边了,可以设置按下某个键移动视角吗

这...我试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 20:00:26 | 显示全部楼层

这个更为绝佳:等质三体+行星(楽)
import turtle
import math as ma

tstep=0.0002
def _angle(z):
    if z.real>0:
        return ma.atan(z.imag/z.real)
    elif z.real<0:
        return ma.atan(z.imag/z.real)+ma.pi
    else:
        if z.imag>=0:
            return ma.pi/2
        else:
            return -ma.pi/2

mlist=[100000,100000,100000,1]
rlist=[0+60j,40+50j,-80-80j,0+0j]
vlist=[1+1j,0-5j,-5+2j,1-5j]
t_0,t_1,t_2,t_3=turtle.Turtle(),turtle.Turtle(),turtle.Turtle(),turtle.Turtle()
f=0
G=1

t_0.up()
t_1.up()
t_2.up()
t_3.up()
t_0.color("red")
t_1.color("green")
t_2.color("blue")
t_3.color("orange")
t_0.goto(rlist[0].real,rlist[0].imag)
t_1.goto(rlist[1].real,rlist[1].imag)
t_2.goto(rlist[2].real,rlist[2].imag)
t_3.goto(rlist[3].real,rlist[3].imag)
#t_0.down()
#t_1.down()
#t_2.down()
t_3.down()

def F(a,b):
    f=G*mlist[a]*mlist[b]/abs(rlist[a]-rlist[b])
    return f*ma.cos(_angle(rlist[b]-rlist[a]))+f*ma.sin(_angle(rlist[b]-rlist[a]))*1j

while True:
    for i in range(50):
        vlist[0]+=(F(0,1)+F(0,2)+F(0,3))/mlist[0]*tstep
        vlist[1]+=(F(1,0)+F(1,2)+F(1,3))/mlist[1]*tstep
        vlist[2]+=(F(2,0)+F(2,1)+F(2,3))/mlist[2]*tstep
        vlist[3]+=(F(3,0)+F(3,1)+F(3,2))/mlist[3]*tstep
        rlist[0]+=vlist[0]*tstep
        rlist[1]+=vlist[1]*tstep
        rlist[2]+=vlist[2]*tstep
        rlist[3]+=vlist[3]*tstep
    t_0.goto(rlist[0].real,rlist[0].imag)
    t_1.goto(rlist[1].real,rlist[1].imag)
    t_2.goto(rlist[2].real,rlist[2].imag)
    t_3.goto(rlist[3].real,rlist[3].imag)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 20:01:46 | 显示全部楼层
目前正在研究关于tkinter的做法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 20:26:03 | 显示全部楼层
额外减小 发表于 2023-2-20 20:00
这个更为绝佳:等质三体+行星(楽)

一般三体会分裂成二体和另外一颗恒星旋转或者弹出
这个是很稳的了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 20:31:31 | 显示全部楼层
歌者文明清理员 发表于 2023-2-20 20:26
一般三体会分裂成二体和另外一颗恒星旋转或者弹出
这个是很稳的了

你懂的真多,但我想问问为什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 20:43:43 | 显示全部楼层
额外减小 发表于 2023-2-20 20:31
你懂的真多,但我想问问为什么?

不知道,b 站很多三体模拟都是这样
除了三体的特解不会分裂

再说一句,turtle 的内核是 tkinter
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 20:45:15 | 显示全部楼层
歌者文明清理员 发表于 2023-2-20 20:43
不知道,b 站很多三体模拟都是这样
除了三体的特解不会分裂


最后一句我知道。
不过你这个分裂的结论还需要理论依据呀。
比如用概率论证明啥的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 20:50:12 | 显示全部楼层
额外减小 发表于 2023-2-20 20:45
最后一句我知道。
不过你这个分裂的结论还需要理论依据呀。
比如用概率论证明啥的

啊哈视频里也有讲,自行百度试试?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-2-20 20:58:00 | 显示全部楼层
歌者文明清理员 发表于 2023-2-20 20:50
啊哈视频里也有讲,自行百度试试?


刚刚我试了一下,发现三颗日一起飞出屏幕
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-2-20 22:19:12 | 显示全部楼层
额外减小 发表于 2023-2-20 20:58

刚刚我试了一下,发现三颗日一起飞出屏幕

《团结一致》
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-7 21:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表