Как уменьшить мерцание в 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):

и так далее.

Другие вопросы по тегам