赞
踩
先看实现后的动画
说明:黄色箭头出现即指向的位置,为二者达到共速点的位置
滑块木板运动动画
原码
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。