额外减小 发表于 2023-2-18 14:28:50

第一次用Turtle绘图,做了个简单的小玩意

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

如题
演绎三体运动的程序
效果:

代码:
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=
rlist=
vlist=
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.real,rlist.imag)
t_1.goto(rlist.real,rlist.imag)
t_2.goto(rlist.real,rlist.imag)
t_0.down()
t_1.down()
t_2.down()

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

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

一点沙 发表于 2023-2-18 14:31:54

好厉害{:10_257:}

额外减小 发表于 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 的 颜色

歌者文明清理员 发表于 2023-2-18 15:58:51

https://xxx.ilovefishc.com/album/202302/18/155753f63z3s55054sgsb4.png
哈哈

额外减小 发表于 2023-2-18 17:27:12

歌者文明清理员 发表于 2023-2-18 15:58
哈哈

ha{:10_279:}

歌者文明清理员 发表于 2023-2-18 20:26:34

额外减小 发表于 2023-2-18 17:27
ha

像极了题目不会做的时候我抓头皮屑的路线

额外减小 发表于 2023-2-18 20:31:37

歌者文明清理员 发表于 2023-2-18 20:26
像极了题目不会做的时候我抓头皮屑的路线

哈哈{:10_264:}

额外减小 发表于 2023-2-18 21:30:03


绿色星球想掺和到红色和蓝色星球的紧密联系中
奈何质量太小,无足轻重,只能紧随其后{:10_266:}

歌者文明清理员 发表于 2023-2-19 07:53:52

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

这,万一球跑到右边了,可以设置按下某个键移动视角吗

歌者文明清理员 发表于 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=
rlist=
vlist=
vlist.insert(1, -vlist)
vlist.append(vlist+(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.real,rlist.imag)
t_1.goto(rlist.real,rlist.imag)
t_2.goto(rlist.real,rlist.imag)
t_0.down()
t_1.down()
t_2.down()

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

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

额外减小 发表于 2023-2-19 11:30:15

歌者文明清理员 发表于 2023-2-19 07:53
这,万一球跑到右边了,可以设置按下某个键移动视角吗

这...我试试

额外减小 发表于 2023-2-20 20:00:26

歌者文明清理员 发表于 2023-2-19 08:20
等质二体+行星

这个更为绝佳:等质三体+行星(楽)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=
rlist=
vlist=
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.real,rlist.imag)
t_1.goto(rlist.real,rlist.imag)
t_2.goto(rlist.real,rlist.imag)
t_3.goto(rlist.real,rlist.imag)
#t_0.down()
#t_1.down()
#t_2.down()
t_3.down()

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

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

额外减小 发表于 2023-2-20 20:01:46

目前正在研究关于tkinter的做法。

歌者文明清理员 发表于 2023-2-20 20:26:03

额外减小 发表于 2023-2-20 20:00
这个更为绝佳:等质三体+行星(楽)

一般三体会分裂成二体和另外一颗恒星旋转或者弹出
这个是很稳的了

额外减小 发表于 2023-2-20 20:31:31

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

你懂的真多,但我想问问为什么?

歌者文明清理员 发表于 2023-2-20 20:43:43

额外减小 发表于 2023-2-20 20:31
你懂的真多,但我想问问为什么?

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

再说一句,turtle 的内核是 tkinter

额外减小 发表于 2023-2-20 20:45:15

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



最后一句我知道。
不过你这个分裂的结论还需要理论依据呀。
比如用概率论证明啥的

歌者文明清理员 发表于 2023-2-20 20:50:12

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

啊哈视频里也有讲,自行百度试试?

额外减小 发表于 2023-2-20 20:58:00

歌者文明清理员 发表于 2023-2-20 20:50
啊哈视频里也有讲,自行百度试试?


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

歌者文明清理员 发表于 2023-2-20 22:19:12

额外减小 发表于 2023-2-20 20:58

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

《团结一致》
页: [1] 2
查看完整版本: 第一次用Turtle绘图,做了个简单的小玩意