vpython学习--实现滑块木板联动

先看实现后的动画
说明:黄色箭头出现即指向的位置,为二者达到共速点的位置

滑块木板运动动画

原码

from vpython import *
'''
'''
#滑块参数
l1, h1, w1 = 0.2, 0.2, 0.2 #长高宽
m1, v1, c1 = 2, 5, color.red
#木板参数
l2, h2, w2 = 1, 0.2, 0.4 #长高宽
m2, v2, c2 = 0.5, 0, color.green
# 公共参数
floor_l=6  #地板长度
g = 10     #重力加速度
dt = 0.0001 # 时间间隔
mu = 0.3   #滑动摩擦系数
t = 0      #时间
i = 0      #共速标志位,同时控制循环跳出
iMax = 1200 #达到共速后,为了动画好看,再滑动一会

''' 滑板运动的场景'''
room = canvas(title='板块滑动动画', width = 800, height=600, center=vec(0, 0.5, 0),
                 background=color.gray(0.4))
cameraPos = vec(1.5,2,4) 
room.camera.pos = cameraPos            #摄像机,即观察者的位置
room.camera.axis = cameraPos * -1      #摄像机对准的方向,这里指向原点
x = arrow(pos=vector(0,0,0), axis=vector(1,0,0), length=2, shaftwidth=0.1, color=color.white)                     #坐标轴
y = arrow(pos=vector(0,0,0), axis=vector(0,1,0), length=2, shaftwidth=0.1, color=color.white)
#z = arrow(pos=vector(0,0,0), axis=vector(0,0,1), length=2, shaftwidth=0.1, color=color.white)
# 画地面
floor = box(pos=vec(0.5 * floor_l, -0.1, 0), size=vec(floor_l,0.2,4), color=color.gray(0.6))
# 画木板
ban = box(pos=vec(0.5*l2, 0.5*h2, 0), size=vec(l2, h2, w2), color=c2, v=vec(v2,0,0))
# 画滑块
kuai = box(pos=vec(-1, h2+0.5*h1, 0), size=vec(l1,h1,w1),color=c1,v=vec(v1,0,0))

# 画v-t图像
tu=graph(title='v-t图像', x=650, y=300, width=600, height=450, xtitle="t(s)", ytitle="v(m/s), 红色:滑块;绿色:木板")
kuai_vt = gcurve(graph=tu,color=c1)
ban_vt = gcurve(graph=tu, color=c2)

while kuai.pos.x < 0:
    rate(1000)
    kuai.pos.x += kuai.v.x * dt
""" 制作动态过程"""
#执行循环,滑块掉下来或者
while (ban.pos.x + l1 / 2) >= ban.pos.x >= 0 and i < iMax:
    # print(kuai.v.x , ban.v.x)
    rate(1000)
    if kuai.v.x > ban.v.x:
        f = mu*m1*g
        ban.a = vec(f/m2, 0, 0)
        kuai.a = vec(-f/m1, 0, 0)
    elif kuai.v.x < ban.v.x:
        f = mu*m1*g
        ban.a = vec(-f/m2, 0, 0)
        kuai.a = vec(f/m1, 0, 0)
    else:
        f = 0
        ban.a = vec(0, 0, 0)
        kuai.a = vec(0, 0, 0)

    #求共速的时间
    if abs(kuai.v.x - ban.v.x) < 0.005 and i==0:
        T = t
        i = 1
        # 在共速的位置弄个箭头作标识
        arrow(pos=vec(kuai.pos.x, 1, 0),axis=vector(0,-1,0), length=0.6, shaftwidth=0.1, color=color.yellow)
    elif i >0:
        # 共速后,为了动画好看,再滑动一点时间
        i += 1

    # 求两物体速度和位置
    ban.v += ban.a * dt
    kuai.v += kuai.a * dt
    ban.pos += ban.v * dt
    kuai.pos += kuai.v * dt

    # 画出 v-t 图
    ban_vt.plot(pos=(t, ban.v.x))
    kuai_vt.plot(pos=(t, kuai.v.x))

    t += dt

# 求相对位移
S =  kuai.pos.x - 0.5*l1 - (ban.pos.x - 0.5*l2)

print('到达共速的时间:', T)
print('相对位移:', S)


感谢B站大神布鲁斯特147

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值