这是我的代码:
from vpython import *
from math import *
import numpy as np
from __future__ import division
stick = cylinder()
stick.pos = vec(0,5,-15)
stick.axis = vec(0,1,0)
stick.length = 30
stick.radius = 0.75
stick.color = vec(.5,.5,.8)
scene.forward = vec(-1,-1,-2)
scene.range = 15
spheres = []
for i in range (0, 15):
s = sphere()
s.radius = 1.5
s.theta_0 = -0.5
s.period = 75/(50+i)
s.color = color.hsv_to_rgb(vec(i/15, 0.75,0.9))
s.wire = cylinder()
s.wire.color = s.color
s.wire.pos = stick.pos + vec(0,0,i+0.5)*stick.length/15
s.wire.axis = vec(0,-1,0)
s.wire.length = 2*np.pi*9.81*s.period*s.period
s.wire.radius = 0.1
spheres.append(s)
dt = 0.2
t = 0
while True:
rate(1/dt)
for i in range(0, len(spheres)):
s = spheres[i]
theta = s.theta_0 * cos( 2*pi*t/s.period )
s.wire.axis = vec(np.sin(theta),-np.cos(theta),0)
s.pos = s.wire.pos + s.wire.axis*s.wire.length
t = t + dt
我想做一个跳舞的钟摆。但是,应将球体连接到杆上的线材的长度不正确。如何使电线长度正确?
答案 0 :(得分:0)
您不需要从数学导入*(来自vpython import *中包含的内容),并且在Jupyter环境中,您可以选择从未来执行"的VPython笔记本 import division,print_function" (在任何情况下,这样的声明必须是文件中的第一个声明,因此您的程序不能按原样运行)。没有理由导入numpy并将其用于pi和sin和cos。实际上,如果参数是单个数字,Python自己的sin和cos函数比numpy函数更快。
更多" Pythonic"处理循环遍历球体的方法是这样写:
对于球体中的s: theta = .....
我不会'知道你的意图是什么,但我建议你暂时使球体不可见(可见=假),注释掉速率声明,并在球体循环中插入scene.pause()以查看发生了什么。您会看到电线最初从球体向下拉出,然后明显塌陷到非常短的长度。
我将宣传一个更好的地方来提出VPython问题是在VPython论坛上
https://groups.google.com/forum/?fromgroups&hl=en#!forum/vpython-users