《 VPython 10套新手入门完整可运行源码》
VPython 10套新手入门完整可运行源码
全部复制即可运行,安装依赖:pip install vpython
1. 基础弹跳小球(力学入门)
fromvpythonimport*# 场景设置scene=canvas(title="弹跳小球",width=600,height=400)floor=box(pos=vector(0,-5,0),size=vector(12,0.5,6),color=color.gray(0.3))ball=sphere(pos=vector(0,4,0),radius=1,color=color.red)# 物理参数ball.v=vector(0,0,0)g=vector(0,-9.8,0)dt=0.01whileTrue:rate(100)ball.v+=g*dt ball.pos+=ball.v*dt# 地面碰撞反弹ifball.pos.y-ball.radius<floor.pos.y+floor.size.y/2:ball.v.y=-ball.v.y*0.85# 恢复系数2. 弹簧振子(简谐运动)
fromvpythonimport*scene=canvas(title="弹簧振子")wall=box(pos=vector(-5,0,0),size=vector(0.5,4,4),color=color.gray(0.2))block=box(pos=vector(2,0,0),size=vector(1.5,1.5,1.5),color=color.blue)spring=helix(pos=wall.pos,axis=block.pos-wall.pos,radius=0.4,coils=12)# 物理参数k=15m=2block.v=vector(1.2,0,0)dt=0.01whileTrue:rate(100)spring.axis=block.pos-wall.pos stretch=mag(spring.axis)-7F=-k*stretch*norm(spring.axis)block.v+=F/m*dt block.pos+=block.v*dt3. 单摆仿真
fromvpythonimport*scene=canvas(title="单摆")pivot=sphere(pos=vector(0,5,0),radius=0.2,color=color.gray(0.5))bob=sphere(pos=vector(3,0,0),radius=0.4,color=color.green)rod=cylinder(pos=pivot.pos,axis=bob.pos-pivot.pos,radius=0.1)L=mag(bob.pos-pivot.pos)bob.v=vector(0,0.6,0)g=9.8dt=0.01whileTrue:rate(100)rod.axis=bob.pos-pivot.pos theta=atan2(bob.pos.x,bob.pos.y-pivot.pos.y)a_tan=-g*sin(theta)/L bob.v.x+=a_tan*dt bob.pos.x+=bob.v.x*dt# 约束摆长r=bob.pos-pivot.pos bob.pos=pivot.pos+L*norm(r)4. 两球弹性碰撞
fromvpythonimport*scene=canvas(title="弹性碰撞")ball1=sphere(pos=vector(-3,0,0),radius=0.8,color=color.orange)ball2=sphere(pos=vector(3,0,0),radius=0.8,color=color.cyan)m1,m2=1,1ball1.v=vector(2.5,0,0)ball2.v=vector(0,0,0)dt=0.01whileTrue:rate(100)ball1.pos+=ball1.v*dt ball2.pos+=ball2.v*dt# 碰撞检测dist=mag(ball1.pos-ball2.pos)ifdist<ball1.radius+ball2.radius:v1,v2=ball1.v.x,ball2.v.x ball1.v.x=((m1-m2)*v1+2*m2*v2)/(m1+m2)ball2.v.x=((m2-m1)*v2+2*m1*v1)/(m1+m2)5. 点电荷电场可视化
fromvpythonimport*scene=canvas(title="点电荷电场",background=color.black)q1=sphere(pos=vector(0,0,0),radius=0.3,color=color.red)q2=sphere(pos=vector(4,0,0),radius=0.3,color=color.blue)# 绘制电场箭头k=9e9step=1forxinrange(-6,7,step):foryinrange(-4,5,step):forzinrange(-2,3,step):pos=vector(x,y,z)r1=pos-q1.pos r2=pos-q2.pos E1=k*1*norm(r1)/mag(r1)**2E2=k*(-1)*norm(r2)/mag(r2)**2E=E1+E2 arrow(pos=pos,axis=E*0.08,color=color.yellow)6. 行星绕恒星轨道(开普勒)
fromvpythonimport*scene=canvas(title="行星轨道")star=sphere(pos=vector(0,0,0),radius=1.2,color=color.yellow,emissive=True)planet=sphere(pos=vector(6,0,0),radius=0.4,color=color.blue,make_trail=True)G=1M_star=10planet.v=vector(0,1.3,0)dt=0.01whileTrue:rate(100)r=planet.pos-star.pos F=-G*M_star*1*norm(r)/mag(r)**2planet.v+=F*dt planet.pos+=planet.v*dt7. 滑块斜面摩擦
fromvpythonimport*scene=canvas(title="斜面滑块")# 斜面angle=radians(25)slope=box(pos=vector(3,-1.5,0),size=vector(8,0.3,3),color=color.gray(0.4))slope.rotate(angle=angle,axis=vector(0,0,1),origin=slope.pos)block=box(pos=vector(0,2,0),size=vector(1,1,1),color=color.magenta)g=9.8mu=0.12block.v=vector(0,0,0)dt=0.01whileTrue:rate(100)# 沿斜面坐标系分解重力sinA=sin(angle)cosA=cos(angle)a_down=g*sinA-mu*g*cosA block.v.x+=a_down*dt block.pos.x+=block.v.x*dt block.pos.y=block.pos.x*tan(angle)+0.68. 带电粒子在磁场回旋
fromvpythonimport*scene=canvas(title="磁场中带电粒子回旋",background=color.black)# 匀强磁场箭头B=vector(0,0,0.8)forzinrange(-4,5,2):arrow(pos=vector(0,0,z),axis=vector(0,0,1),color=color.green,shaftwidth=0.1)charge=sphere(pos=vector(-4,0,0),radius=0.3,color=color.orange,make_trail=True)q=1m=0.5charge.v=vector(0,2.5,0)dt=0.01whileTrue:rate(100)F=q*cross(charge.v,B)charge.v+=F/m*dt charge.pos+=charge.v*dt9. 实时数据绘图(弹簧能量曲线)
fromvpythonimport*scene=canvas(title="弹簧振子能量")plot=graph(title="动能&势能",xtitle="时间",ytitle="能量")Ek_curve=gcurve(color=color.red,label="动能")Ep_curve=gcurve(color=color.blue,label="弹性势能")wall=box(pos=vector(-5,0,0),size=vector(0.5,3,3))block=box(pos=vector(2,0,0),size=vector(1,1,1))spring=helix(pos=wall.pos,axis=block.pos-wall.pos,radius=0.3)k=12m=1block.v=vector(1.5,0,0)t=0dt=0.01whileTrue:rate(100)spring.axis=block.pos-wall.pos stretch=mag(spring.axis)-6F=-k*stretch*norm(spring.axis)block.v+=F/m*dt block.pos+=block.v*dt# 能量计算Ek=0.5*m*mag(block.v)**2Ep=0.5*k*stretch**2Ek_curve.plot(t,Ek)Ep_curve.plot(t,Ep)t+=dt10. 3D基础几何体+鼠标交互
fromvpythonimport*scene=canvas(title="基础几何体 鼠标拖拽物体")box(pos=vector(-3,0,0),size=vector(1.5,1.5,1.5),color=color.cyan)sphere(pos=vector(0,0,0),radius=0.8,color=color.orange)cylinder(pos=vector(3,0,0),axis=vector(0,2,0),radius=0.6,color=color.green)cone(pos=vector(0,-3,0),axis=vector(0,1.5,0),radius=0.7,color=color.magenta)# 鼠标拖拽逻辑drag_obj=Nonedefmouse_down(evt):globaldrag_obj drag_obj=scene.mouse.pickdefmouse_move(evt):ifdrag_obj:drag_obj.pos=scene.mouse.posdefmouse_up(evt):globaldrag_obj drag_obj=Nonescene.bind("mousedown",mouse_down)scene.bind("mousemove",mouse_move)scene.bind("mouseup",mouse_up)运行说明
- 安装:
pip install vpython - 新建py文件,复制任意一段代码直接运行,会自动弹出浏览器3D窗口
- 操作:鼠标左键拖拽旋转视角,滚轮缩放,右键平移画面
- 拓展:可自行修改质量、重力、电荷、弹簧劲度系数等参数观察变化
