总体来说,这些类构成了一个支持矢量图形的体系结构,提供了创建、管理和操作数学对象的灵活性。描述使用矢量图形的 Mobject(数学对象)的术语。这些对象在动画和数学绘图领域常用于创建灵活和可扩展的图形。
1.CurvesAsSubmobjects
这个类的作用是将曲线的元素转换为子对象(submobjects)。这样可以更好地管理和操作复杂的曲线结构。
CurvesAsSubmobjects(vmobject, **kwargs)
CurvesAsSubmobjects(vmobject, **kwargs)
是一个函数或类,用于将一个 VMobject
中的曲线元素转换为子对象(submobjects)。这个过程使得曲线可以更方便地进行进一步的处理、动画或变换。
参数说明:
-
vmobject:
- 类型:
VMobject
- 这是输入的矢量化对象,通常是一个包含曲线或路径的对象。该对象中的曲线会被分解为单独的子对象。
- 类型:
-
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 中的图形对象(如Circle
、Square
、Tex
等)。可以将一个或多个 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)