如何减少 vpython 中的闪烁?
How do I reduce flicker in 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
我用你提供的数据测试了你的代码,你的问题在于对 range
函数的误解。
您的问题是,在 Python 中,您作为 range
的第二个参数提供的上限未包含在结果范围内(即 range(1,4)
returns [1,2,3]
).
您的数据采用的格式是,每块 20 行是一帧中 20 个球体的位置。如果你这样做 for j in range(0,n-1):
它与 for j in range(0, 19):
相同所以你只迭代 19 个数据点(索引 0 到 18)而不是每帧你需要的 20 个,这会导致闪烁,因为在下一帧您想要用于第一个球体的数据实际上是您在最后一帧中忘记的最后一个球体的数据。
解决方案是从所有调用 range
函数的第二个参数中删除 -1
。例如更改行
for i in range(0,n-1):
至
for i in range(0, n):
等等。
这是我的代码。
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
我用你提供的数据测试了你的代码,你的问题在于对 range
函数的误解。
您的问题是,在 Python 中,您作为 range
的第二个参数提供的上限未包含在结果范围内(即 range(1,4)
returns [1,2,3]
).
您的数据采用的格式是,每块 20 行是一帧中 20 个球体的位置。如果你这样做 for j in range(0,n-1):
它与 for j in range(0, 19):
相同所以你只迭代 19 个数据点(索引 0 到 18)而不是每帧你需要的 20 个,这会导致闪烁,因为在下一帧您想要用于第一个球体的数据实际上是您在最后一帧中忘记的最后一个球体的数据。
解决方案是从所有调用 range
函数的第二个参数中删除 -1
。例如更改行
for i in range(0,n-1):
至
for i in range(0, n):
等等。