python动画:矢量图形的体系结构演示

总体来说,这些类构成了一个支持矢量图形的体系结构,提供了创建、管理和操作数学对象的灵活性。描述使用矢量图形的 Mobject(数学对象)的术语。这些对象在动画和数学绘图领域常用于创建灵活和可扩展的图形。

1.CurvesAsSubmobjects

这个类的作用是将曲线的元素转换为子对象(submobjects)。这样可以更好地管理和操作复杂的曲线结构。

CurvesAsSubmobjects(vmobject, **kwargs)

 CurvesAsSubmobjects(vmobject, **kwargs) 是一个函数或类,用于将一个 VMobject 中的曲线元素转换为子对象(submobjects)。这个过程使得曲线可以更方便地进行进一步的处理、动画或变换。

参数说明:

  1. vmobject:

    • 类型: VMobject
    • 这是输入的矢量化对象,通常是一个包含曲线或路径的对象。该对象中的曲线会被分解为单独的子对象。
  2. kwargs:

    • 类型: 可变关键字参数
    • 这些参数可以是任何其他的配置或设置,具体取决于 CurvesAsSubmobjects 的实现。在很多情况下,这些参数用于控制转换的细节,比如颜色、线条样式、是否添加某些属性等等。

功能简介:

  • CurvesAsSubmobjects 类的主要功能是便于管理复杂的曲线对象。通过将曲线的不同组成部分转变为独立的子对象(submobjects),可以让用户对每一部分进行单独的操作,比如单独动画、颜色变化或是其他样式调整。
  • 这对于需要精细控制或动画效果的场景非常有用,特别是在数学和物理可视化中。

用法示例:

class LineGradientExample(Scene):
    def construct(self):
        curve = ParametricFunction(lambda t: [t, np.sin(t), 0], t_range=[-PI, PI, 0.01], stroke_width=10)
        new_curve = CurvesAsSubmobjects(curve)
        new_curve2 = CurvesAsSubmobjects(curve)
        new_curve.set_color_by_gradient(BLUE, RED)
        new_curve2.set_color_by_gradient(BLUE)
        
        self.add(new_curve.shift(UP), curve,new_curve2.shift(DOWN))

2.DashedVMobject

这是一个由虚线(dashes)组成的 VMobject。相较于常规的线条对象,这种对象使用虚线来表示图形,适合需要突出表达的场景。

DashedVMobject(vmobject, num_dashes=15, dashed_ratio=0.5, dash_offset=0,
 color=ManimColor('#FFFFFF'), equal_lengths=True, **kwargs)

DashedVMobject 是 Manim 中类 VMobject 的一个子类,它用于创建带有虚线效果的路径或图形。这个类允许你将任何 VMobject 转换为虚线,具有一些参数可以定制虚线的外观和行为。以下是每个参数的详细说明:

函数和参数解释

  • vmobject:

    • 要转换为虚线的 VMobject 实例。这个对象通常是你先前创建的路径、曲线或任何其他的 VMobject
  • num_dashes (默认值: 15):

    • 虚线的段数。这个参数决定了虚线中可见的短段数量。如果要控制虚线的整体外观,可以调整此值。
  • dashed_ratio (默认值: 0.5):

    • 这个参数控制虚线段的长度与间隔的比例。具体来说,虚线段的长度相对于间隔的比例为 dashed_ratio,如果 dashed_ratio 设置为 0.5,那么每个虚线段和其后面的间隔长度相同。
  • dash_offset (默认值: 0):

    • 虚线的偏移量。改变这个值会使虚线的起始位置有所移动,通常用于实现动态效果或使得虚线的可视化效果更具有吸引力。
  • color (默认值: ManimColor('#FFFFFF')):

    • 虚线的颜色。这个参数可以使用 Manim 的颜色对象,也可以使用标准的 RGB 颜色表达方式。默认情况下,虚线为白色。
  • equal_lengths (默认值: True):

    • 此参数指示虚线的每个段和间隔是否应该有相等的长度。如果设置为 True,每个虚线段和其间隔的长度会相同;如果设置为 False,你可以根据 dashed_ratio 调整它们的长度。
  • **kwargs:

    • 这是一个可接受额外关键字参数的参数,允许你将其他 VMobject 的参数传递给 DashedVMobject。这为自定义提供了更大的灵活性,比如设置曲线的宽度等属性。

示例

下面是一个使用 DashedVMobject 的简单示例:

class DashedVMobjectExample(Scene):
    def construct(self):
        r = 0.5

        top_row = VGroup()  # Increasing num_dashes
        for dashes in range(1, 12):
            circ = DashedVMobject(Circle(radius=r, color=RED), num_dashes=dashes)
            top_row.add(circ)

        middle_row = VGroup()  # Increasing dashed_ratio
        for ratio in np.arange(1 / 11, 1, 1 / 11):
            circ = DashedVMobject(
                Circle(radius=r, color=BLUE), dashed_ratio=ratio
            )
            middle_row.add(circ)

        func1 = FunctionGraph(lambda t: t**5,[-1,1],color=WHITE)
        func_even = DashedVMobject(func1,num_dashes=6,equal_lengths=True)
        func_stretched = DashedVMobject(func1, num_dashes=6, equal_lengths=False)
        bottom_row = VGroup(func_even,func_stretched)

        top_row.arrange(buff=0.3)
        middle_row.arrange()
        bottom_row.arrange(buff=1)
        everything = VGroup(top_row, middle_row, bottom_row).arrange(DOWN, buff=1)
        self.add(everything)

 

3.VDict

这个类类似于 VGroup,也提供通过键(key)访问子对象(submobject)的功能,像 Python 字典(dict)一样。这使得管理和查找子对象变得更加方便。

VDict(mapping_or_iterable={}, show_keys=False, **kwargs)

 函数和参数解释

  • mapping_or_iterable (默认值: {}):

    • 这个参数可以是一个映射(如字典)或一个可迭代对象(如列表),用于初始化 VDict 的内容。如果使用字典,则键值对会用于生成可视化元素。如果使用列表,它会被视为一组键值对。
  • show_keys (默认值: False):

    • 如果设置为 True,在可视化中将会显示字典的键。这对于向观众明确展示哪些是键非常有用。如果设置为 False,只会显示值部分。
  • **kwargs:

    • 这里的 **kwargs 是可接受的其他关键字参数,允许用户为 VDict 提供更多的自定义选项。这些可选项可能包括颜色、字体大小、位置等,具体取决于 VDict 的实现。

示例

下面是一个使用 VDict 的简单示例:

from manim import *  

class ShapesWithVDict(Scene):  
    def construct(self):  
        # 创建一个红色正方形  
        square = Square().set_color(RED)  
        # 创建一个黄色圆形,并将其放置在正方形的上方  
        circle = Circle().set_color(YELLOW).next_to(square, UP)  

        # 创建一个由键-对象对组成的列表  
        pairs = [("s", square), ("c", circle)]  
        # 使用 VDict 创建一个字典,这里显示键  
        my_dict = VDict(pairs, show_keys=True)  

        # 动画效果,显示 VDict,类似于 VGroup  
        self.play(Create(my_dict))  
        self.wait()  

        # 创建一个绿色文本,并将其放置在正方形的下方  
        text = Tex("Some text").set_color(GREEN).next_to(square, DOWN)  

        # 通过将其包装为单元素列表的元组,向字典添加一个键-值对  
        my_dict.add([("t", text)])  
        self.wait()  

        # 创建一个矩形,并将其放置在文本的下方  
        rect = Rectangle().next_to(text, DOWN)  
        # 也可以像Python字典一样进行键赋值  
        my_dict["r"] = rect  

        # 像访问 Python 字典一样访问子对象  
        my_dict["t"].set_color(PURPLE)  # 设置键 "t" 的颜色  
        self.play(my_dict["t"].animate.scale(3))  # 动画放大  
        self.wait()  

        # 也支持Python字典样式的重新赋值  
        my_dict["t"] = Tex("Some other text").set_color(BLUE)  
        self.wait()  

        # 通过键删除子对象  
        my_dict.remove("t")  
        self.wait()  

        # 逐步消失正方形  
        self.play(Uncreate(my_dict["s"]))  
        self.wait()  

        # 逐步消失圆形  
        self.play(FadeOut(my_dict["c"]))  
        self.wait()  

        # 逐步消失矩形,并向下移动  
        self.play(FadeOut(my_dict["r"], shift=DOWN))  
        self.wait()  

        # 使用现有字典的 mobjects 创建 VDict  
        plain_dict = {  
            1: Integer(1).shift(DOWN),  # 将整数 1 移动到下方  
            2: Integer(2).shift(2 * DOWN),  # 将整数 2 移动到更下方  
            3: Integer(3).shift(3 * DOWN),  # 将整数 3 移动到最下方  
        }  

        # 通过替换现有字典创建 VDict  
        vdict_from_plain_dict = VDict(plain_dict)  
        # 将 vdict 移动到画面左上方  
        vdict_from_plain_dict.shift(1.5 * (UP + LEFT))  
        # 动画效果,显示新创建的 VDict  
        self.play(Create(vdict_from_plain_dict))  

        # 使用 zip 创建 VDict  
        vdict_using_zip = VDict(zip(["s", "c", "r"], [Square(), Circle(), Rectangle()]))  
        # 将这个新的 VDict 移动到画面右侧  
        vdict_using_zip.shift(1.5 * RIGHT)  
        # 动画效果,显示这个新创建的 VDict  
        self.play(Create(vdict_using_zip))  
        self.wait()

4.VGroup

这是一个包含多个矢量化 Mobject 的分组类,允许将多个对象组合在一起,方便进行整体变换或操作。

VGroup(*vmobjects, **kwargs)

 VGroup 是 Manim 中的一个类,用于将多个可视化对象 (VMobjects) 组合在一起,形成一个单一的对象。这使得多个可视化元素可以作为一个整体进行操作,包括平移、缩放、旋转等动画。

函数签名

VGroup(*vmobjects, **kwargs) 

参数说明

  • *vmobjects:可变数量的可视化对象,通常是 Manim 中的图形对象(如 CircleSquareTex 等)。可以将一个或多个 VMobjects 作为参数传递给 VGroup。

  • **kwargs:额外的关键字参数。这些参数可以用来设置 VGroup 的属性,例如:

    • color:设置 VGroup 中所有对象的颜色。
    • stroke_width:设置边界的宽度。
    • fill_color 和 fill_opacity:设置填充颜色和不透明度。
    • 其他参数,如定位、显示等,可以参考 VGroup 或基类 VMobject 的文档。

使用示例1:

from manim import *  

class MyScene(Scene):  
    def construct(self):  
        # 创建几个可视化对象  
        circle = Circle()  
        square = Square()  
        triangle = Triangle()  

        # 使用 VGroup 将这些对象组合在一起  
        groupD = VGroup(circle, square, triangle).arrange(DOWN, buff=1).shift(2*RIGHT)
        self.play(Create(groupD))
        self.wait(1) 
        
        grouprR = VGroup(circle, square, triangle).arrange(RIGHT, buff=0.1).shift(3*LEFT)

        # 显示组合体  
        self.play(Create(grouprR))
        self.wait()  

 示例2:

from manim import *

class ArcShapeIris(Scene):
    def construct(self):
        colors = [DARK_BROWN, BLUE_E, BLUE_D, BLUE_A, TEAL_B, GREEN_B, YELLOW_E]
        radius = [1 + rad * 0.1 for rad in range(len(colors))]

        circles_group = VGroup()

        # zip(radius, color) makes the iterator [(radius[i], color[i]) for i in range(radius)]
        circles_group.add(*[Circle(radius=rad, stroke_width=10, color=col)
                            for rad, col in zip(radius, colors)])
        self.add(circles_group)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yasen.M

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值