Почему некоторые операторы работают только для последней итерации для l oop в manim? - PullRequest
1 голос
/ 28 марта 2020

Я пытаюсь создать анимацию, в которой я хочу, чтобы список точек и линий отслеживал значение. Я использую объект ValueTracker и методы обновления для этой цели. Используя ShowCreation, я уже добавил эти объекты на сцену. Я использовал для l oop, чтобы добавить апдейтер для каждой Точки и Линии в списке (оба списка имеют одинаковую длину):

 for i in range(len(x_points)):
    dots_cos[i].add_updater(
        lambda mob: mob.move_to(axes2.c2p(x_points[i], np.cos(omega.get_value()*x_points[i]))),
        # call_updater=False
        )
    dots_sin[i].add_updater(
        lambda mob: mob.move_to(axes2.c2p(x_points[i], np.sin(omega.get_value()*x_points[i]))),
        # call_updater=False
        )
    lines_cos[i].add_updater(
        lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
            axes2.coords_to_point(x_points[i], np.cos(omega.get_value()*x_points[i])), color=YELLOW)),
        # call_updater=False
        )
    lines_sin[i].add_updater(
        lambda mob: mob.become(Line(axes2.coords_to_point(x_points[i], 0),
            axes2.coords_to_point(x_points[i], np.sin(omega.get_value()*x_points[i])), color=RED)),
        # call_updater=False
        )

Это не сработало, как предполагалось! Случилось так, что только последние элементы в соответствующих списках получили программу обновления и работали нормально, в то время как остальные элементы просто исчезли со сцены! Я попытался запустить для l oop на zip(x_points, dots_cos, dots_sin, lines_cos, lines_sin), но результат все тот же.

Интересно, когда я попытался сделать то же самое, используя while l oop вместо последней итерации l oop, код пытался добавить средство обновления к последней + 1 итерации, поэтому возникло исключение IndexOutOfBounds. Несмотря на то, что в то время как доброкачественный оператор, такой как оператор печати, работал нормально, l oop.

Кроме того, в случае его значимости списки точек и линий создаются с помощью пользовательской функции, которая возвращает эти списки. .

Так в чем здесь проблема? Как функция add_updater может сломать что-то настолько фундаментальное, как для l oop?

1 Ответ

2 голосов
/ 28 марта 2020

Вы страдаете от хорошо известной проблемы построения лямбд в al oop. Ваше решение может быть:

lambda mob, i=i:  ...
...