Как уменьшить мерцание в 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 ответ
Я проверил ваш код с вашими данными, и ваша проблема заключается в неправильном понимании 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):
и так далее.