提示:本作品为原创,转载请经过作者同意
前言
物理期末大作业,研究荡秋千的物理公式时为了直观,创建了一个秋千模型,可能并不是绝对符合现实物理规律。
一、代码
先上代码:
# -*- coding: utf-8 -*-
from vpython import *
scene.width = 1600
scene.height = 850
L = 10
theta = pi / 6
base = box(pos=vector(0, 0, 0), size=vector(1, 0.5, 10), color=color.blue)
zhu1 = box(pos=vector(0, -5, -5), size=vector(1, -10, 0.5), color=color.yellow)
zhu2 = box(pos=vector(0, -5, 5), size=vector(1, -10, -0.5), color=color.yellow)
di = box(pos=vector(0, -10, 0), size=vector(50, 0.001, 50), color=color.blue)
ball1 = sphere(pos=vector(L * sin(theta), -L * cos(theta), 3), radius=0.25, color=color.white)
line1 = cylinder(pos=base.pos + vector(0,0,3), axis=(ball1.pos - base.pos), radius=0.05, color=color.white)
ball2 = sphere(pos=vector(L * sin(theta), -L * cos(theta), -3), radius=0.25, color=color.white)
line2 = cylinder(pos=base.pos + vector(0,0,-3), axis=(ball2.pos - base.pos), radius=0.05, color=color.white)
zhongxin = sphere(pos=vector(L * sin(theta), -L * cos(theta), 0), radius=0.25, color=color.white)
set = box(pos=ball1.pos+vector(0,0,-3) ,size=vector(2, 0.1, 6), color=color.white)
vel = 0
dt = 0.005
t = 0
while t < 100:
rate(100)
acc = - 10 / L * sin(theta)
vel = vel + acc * dt
theta = theta + vel * 180 / pi * dt
ball1.pos = vector(L * sin(theta), -L * cos(theta), 3)
line1.axis = ball1.pos - vector(0, 0, 3)
ball2.pos = vector(L * sin(theta), -L * cos(theta), -3)
line2.axis = ball2.pos - vector(0, 0, -3)
set.pos = ball1.pos + vector(0,0,-3)
if (L * sin(theta))>0:
i=1
else:
i=-1
if (-L * cos(theta))>0:
j=1
else:
j=-1
zhongxin.pos = vector(i*((L * sin(theta))*(L * sin(theta)))/10, j*((-L * cos(theta) + 1)*(-L * cos(theta) + 1))/10, 0)
zhongxin.axis = zhongxin.pos - vector(0, 0, 0)
print(zhongxin.pos)
t = t + dt
二、代码详解
1.引入库
from vpython import *
2.初始角度
theta = pi / 6
3.创建各类元素
base = box(pos=vector(0, 0, 0), size=vector(1, 0.5, 10), color=color.blue)
zhu1 = box(pos=vector(0, -5, -5), size=vector(1, -10, 0.5), color=color.yellow)
zhu2 = box(pos=vector(0, -5, 5), size=vector(1, -10, -0.5), color=color.yellow)
di = box(pos=vector(0, -10, 0), size=vector(50, 0.001, 50), color=color.blue)
ball1 = sphere(pos=vector(L * sin(theta), -L * cos(theta), 3), radius=0.25, color=color.white)
line1 = cylinder(pos=base.pos + vector(0,0,3), axis=(ball1.pos - base.pos), radius=0.05, color=color.white)
ball2 = sphere(pos=vector(L * sin(theta), -L * cos(theta), -3), radius=0.25, color=color.white)
line2 = cylinder(pos=base.pos + vector(0,0,-3), axis=(ball2.pos - base.pos), radius=0.05, color=color.white)
zhongxin = sphere(pos=vector(L * sin(theta), -L * cos(theta), 0), radius=0.25, color=color.white)
set = box(pos=ball1.pos+vector(0,0,-3) ,size=vector(2, 0.1, 6), color=color.white)
4.按照物理规则执行(以时间为量度)
while t < 100:
rate(100)
acc = - 10 / L * sin(theta)
vel = vel + acc * dt
theta = theta + vel * 180 / pi * dt
ball1.pos = vector(L * sin(theta), -L * cos(theta), 3)
line1.axis = ball1.pos - vector(0, 0, 3)
ball2.pos = vector(L * sin(theta), -L * cos(theta), -3)
line2.axis = ball2.pos - vector(0, 0, -3)
set.pos = ball1.pos + vector(0,0,-3)
if (L * sin(theta))>0:
i=1
else:
i=-1
if (-L * cos(theta))>0:
j=1
else:
j=-1
zhongxin.pos = vector(i*((L * sin(theta))*(L * sin(theta)))/10, j*((-L * cos(theta) + 1)*(-L * cos(theta) + 1))/10, 0)
zhongxin.axis = zhongxin.pos - vector(0, 0, 0)
print(zhongxin.pos)
t = t + dt
运行结果
总结
物理,每日一学,必有精进