如何在Manim中用Circumscribe仅圈选MathTex中的单个数字?
解决方案
要给表格中每个实数的指定数字添加Circumscribe动画,核心是利用MathTex的特性:它会将每个字符拆分为独立的子对象(submob),通过索引就能定位到目标数字,再对其应用动画即可。
步骤说明
- 定位表格目标单元格:通过
table.get_cell((行号, 列号))获取对应位置的单元格,行号从1开始(第一行为表头),所有实数都在第2列。 - 提取单元格内的
MathTex对象:用get_mobject()方法取出单元格里的内容。 - 定位目标数字的子对象:根据字符串的字符顺序,用索引获取对应位置的submob(索引从0开始)。
- 应用
Circumscribe动画:对目标submob调用动画方法即可。
修改后的完整代码
class SimpleAnimation(Scene): def construct(self): table = MobjectTable([ [MathTex(r"\mathbb{N}"), MathTex(r"\mathbb{R}")], [MathTex(r"1"), MathTex(r"0,156739345...")], [MathTex(r"2"), MathTex(r"0,823478901...")], [MathTex(r"3"), MathTex(r"0,465809217...")], [MathTex(r"4"), MathTex(r"0,156439345...")], [MathTex(r"5"), MathTex(r"0,823478903...")], [MathTex(r"\vdots"), MathTex(r"\vdots")] ], v_buff=0.2, h_buff=1.2) self.add(table) # 定义每行要高亮的数字索引(对应MathTex的submob索引) target_indices = [ (2, 2), # 第二行:0,1... 中的1对应索引2 (3, 3), # 第三行:0,82... 中的2对应索引3 (4, 4), # 第四行:0,465... 中的5对应索引4 (5, 5), # 第五行:0,1564... 中的4对应索引5 (6, 6) # 第六行:0,82347... 中的7对应索引6 ] # 逐个播放高亮动画,也可用self.play(*[...])实现同时播放 for row_idx, char_idx in target_indices: real_num_mob = table.get_cell((row_idx, 2)).get_mobject() self.play(Circumscribe(real_num_mob[char_idx], color=RED, fade_out=True))
关键细节
- 索引计算:以
"0,156739345..."为例,字符顺序对应的索引是:0(0)、,(1)、1(2)、5(3)...,按此规律对应目标数字的索引即可。 - 动画自定义:可通过
Circumscribe的参数调整样式,比如color设置边框颜色,fade_out控制动画结束后边框是否淡出。
内容的提问来源于stack exchange,提问作者Eric Mairene
相关产品推荐
相关产品推荐

