气缸在Vpython中没有得到正确的长度

时间:2016-12-09 23:08:26

标签: vpython

这是我的代码:

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 

我想做一个跳舞的钟摆。但是,应将球体连接到杆上的线材的长度不正确。如何使电线长度正确?

1 个答案:

答案 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