利用vpython实现秋千模型

提示:本作品为原创,转载请经过作者同意


前言

物理期末大作业,研究荡秋千的物理公式时为了直观,创建了一个秋千模型,可能并不是绝对符合现实物理规律。


一、代码

先上代码:

# -*- 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

运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结

物理,每日一学,必有精进

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值