如何减少vpython中的闪烁?

时间:2015-05-22 05:59:09

标签: python python-2.7 flicker vpython

这是我的代码。

from visual import *
s=[]
n=20
num_lines = sum(1 for line in open('G:\Dropbox\Programming\Fortran\Source\Assign2\pos_x.dat'))
loop=num_lines/n
f=open('G:\Dropbox\Programming\Fortran\Source\Assign2\pos_x.dat','r')
box(pos=[10,10,10],length=20,width=20,height=20,opacity=0.3,color=color.white)
for i in range(0,n-1):
    line=f.readline()
    row = line.split()
    x = float(row[0])
    y = float(row[1])
    z = float(row[2])
    s.append(sphere(pos=[x,y,z],radius=1,color=color.cyan))
for i in range(1,loop-1):
    rate(100)
    for j in range(0,n-1):
        line=f.readline()
        row = line.split()
        x = float(row[0])
        y = float(row[1])
        z = float(row[2])
        s[j].pos = [x,y,z]

一些球体(并非所有球体)在显示屏上移动时都会闪烁。如何减少闪烁? 这是pos_x.dat

1 个答案:

答案 0 :(得分:0)

我使用您提供的数据测试了您的代码,您的问题在于对range函数的误解。

您的问题是,在Python中,您提供的上限作为range的第二个参数未包含在结果范围内(即range(1,4)返回[1,2,3])。

您的数据格式为每行20行,即一帧中20个球的位置。如果你执行for j in range(0,n-1):它与for j in range(0, 19):相同,那么你只迭代19个数据点(索引0到18)而不是每帧所需的20个数据点,这会导致闪烁,因为在下一帧您想要用于第一个球体的数据实际上是您在最后一帧中忘记的最后一个球体的数据。

解决方法是从-1函数调用的第二个参数中删除range。例如,更改行

for i in range(0,n-1):

for i in range(0, n):

等等。