есть ли лучший подход для визуализации массива? - PullRequest
4 голосов
/ 16 июня 2020

Я хочу убедиться, что подход, который я использую для отображения массива, не является неудобным решением для лучшего подхода, о котором я не знаю. Многое из того, что у меня есть до сих пор, кажется довольно неудобным.

Для элементов интервалов Я устанавливаю каждый элемент массива TextMobject .next_to предыдущий элемент справа с буфером. Есть ли лучший подход?

Для прямоугольников вокруг элементов Я собирался нарисовать верхнюю и нижнюю линии на всю ширину массива отдельно, а затем провести вертикальные линии между элементами. Я не предполагаю, что буду заботиться об анимации рисования этих блоков различными способами, хотя я планирую выделять элементы, используя для этого существующие инструменты. Есть ли лучший подход?

Вот мой код "привет, мир". Любые предложения / улучшения приветствуются!

class ExampleArray(Scene):
    def construct(self):
        n = 6
        labels = TextMobject(* ["[" + str(index) + "]" for index in range(n)] )
        text = TextMobject( *[str(random.randint(0,10)) for i in range(n) ] )

        # space it out
        for i in range(1,len(text)):
            text[i].next_to(text[i-1], RIGHT, buff = 0.8)

        text.move_to(ORIGIN)


        for i in range(len(labels)):
            labels[i].scale(0.5)
            labels[i].next_to( text[i], DOWN, buff = 0.5)

        # can I just make a copy of top_line?
        top_line = Line(text.get_left() + LEFT, text.get_right() + RIGHT)
        bottom_line = Line(text.get_left() + LEFT, text.get_right() + RIGHT)
        top_line.next_to(text, UP)
        bottom_line.next_to(text, DOWN)

        self.add(labels)
        self.add(top_line, bottom_line)

        for i in range(len(text)):
            self.play(Write(text[i]))
            self.wait(0.1)

1 Ответ

1 голос
/ 17 июня 2020

Я бы так и поступил. Я рекомендую вам принять во внимание следующее:

  1. Всегда модулируйте свой код, если вы не знаете, придется ли вам его повторно использовать.
  2. Всегда лучше читать по вертикали, чем для горизонтального чтения.
  3. Избегайте использования индексов (используйте их, когда это действительно необходимо)
  4. Используйте словарь CONFIG для обобщения переменных, которые вы будете использовать на протяжении всей сцены.
  5. A более короткий код не является синонимом лучшего кода, всегда должен быть баланс между:
    • Легко читается
    • Легко в обслуживании
    • Легко масштабируется
class ExampleArray2(Scene):
    CONFIG = {
        "array_len": 6,
        "random_seed": 1, # with this you force to manim use other numbers
        # Change the random_seed to other number every time you want other 
        # random numbers
    }
    def construct(self):
        labels = TextMobject(*[
            f"[{index}]" 
            for index in range(self.array_len)
        ])
        text = TextMobject(*[
            str(random.randint(0,10))
            for i in range(self.array_len)
        ])
        # space it out
        text.arrange(RIGHT,buff=0.8)
        # See: https://github.com/3b1b/manim/blob/master/manimlib/mobject/mobject.py#L936

        for label,t in zip(labels,text): # I like to avoid using indexes
            label.scale(0.5)
            label.next_to(t,DOWN,buff=0.5)

        up_and_down_line = self.get_up_and_down_line(
            VGroup(text,labels),
            buff=0.7, # Distance between numbers and lines
            scale=1.4 # Scale of the line
        )

        self.play(
            *list(map(lambda x: Write(x,run_time=2),[text,labels])),
            *list(map(GrowFromCenter,up_and_down_line))
        )
        self.wait()

    def get_long_line(self,mob,y_direction,buff=0.5,scale=1):
        return Line(
            mob.get_corner(y_direction + LEFT), 
            mob.get_corner(y_direction + RIGHT)
        ).shift(y_direction*buff).scale(scale)

    def get_up_and_down_line(self,mob,**kwargs):
        return VGroup(
            self.get_long_line(mob,UP,**kwargs),
            self.get_long_line(mob,DOWN,**kwargs)
        )

enter image description here

...