====== 提示词 ====== 你是一位资深 Manim 动画工程师,专注于教育场景。请遵循以下规范: 1. 仅输出 Python 代码,不解释思路。 2. 使用 Manim 社区版 v0.18.0 语法。 3. 严格按提示的步骤进行编码,不要发挥、扩展。 4. 所有公式用 MathTex,文字用 Text(更好地支持中文),颜色统一用 Manim 内置调色板。 5. 关键坐标用常量定义在类顶部,例如 LEFT_MARGIN = 3.2。 6. 每行不超过 88 字符,函数名用 snake_case。 7. 动画时长 3-5 秒 / 步,默认 ease-in-out。 8. 请严格按照以下模板:坐标轴范围、颜色、字体统一使用 Manim 社区版默认主题。 9. 代码的最后,参考下面的代码添加相应内容: if __name__ == "__main__": # 导入必要的模块 import sys import os # 设置 UTF-8 编码 os.environ['PYTHONIOENCODING'] = 'utf-8' sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') # 全局指定 ctex 模板(一次性) config.tex_template = TexTemplateLibrary.ctex # 使用临时配置渲染场景(配置只在with块内有效) with tempconfig({ "quality": "high_quality", "background_color": WHITE, "preview": True }): # 实例化场景类 scene = ParabolaUp() # 执行渲染流程(包含文件生成和预览) scene.render() 10. 【输出要求】 (1). 完整可运行 Python 脚本,文件名 ParabolaUp.py。 (2). 场景类名 ParabolaUp。 (3). 包含 `if __name__ == "__main__":` 可直接 `manim -pql ParabolaUp.py ParabolaUp`。 (4). 代码内只出现中文注释,方便二次修改。 本成的具体需求如下: {XuQiu} ====== 生成结果 ====== ```python from manim import * class ParabolaUp(Scene): # 定义常量坐标 X_MIN, X_MAX = -4, 4 Y_MIN, Y_MAX = -3, 5 LEGEND_X = 3.5 LEGEND_Y_START = 3 LABEL_X = 2.0 def construct(self): # 创建坐标轴系统 axes = Axes( x_range=[self.X_MIN, self.X_MAX, 1], y_range=[self.Y_MIN, self.Y_MAX, 1], axis_config={"color": BLACK} ) axes_labels = axes.get_axis_labels(x_label="x", y_label="y") title = Text("二次函数图像", font_size=24, color=BLACK).to_edge(UP) # 创建三个二次函数图像 graph1 = axes.plot( lambda x: 0.5 * x**2, color=BLUE, x_range=[self.X_MIN, self.X_MAX] ) graph2 = axes.plot( lambda x: -0.5 * x**2, color=RED, x_range=[self.X_MIN, self.X_MAX] ) graph3 = DashedVMobject( axes.plot(lambda x: 0, color=GREEN, x_range=[self.X_MIN, self.X_MAX]), num_dashes=50 ) # 创建函数表达式标签 label1 = MathTex(r"y = 0.5x^2", font_size=24, color=BLUE) label1.move_to(axes.c2p(self.LABEL_X, 0.5 * self.LABEL_X**2 + 0.5)) label2 = MathTex(r"y = -0.5x^2", font_size=24, color=RED) label2.move_to(axes.c2p(self.LABEL_X, -0.5 * self.LABEL_X**2 - 0.5)) label3 = MathTex(r"y = 0", font_size=24, color=GREEN) label3.move_to(axes.c2p(self.LABEL_X, 0.5)) # 创建顶点标记 vertex_dot = Dot(axes.c2p(0, 0), color=BLACK, radius=0.08) vertex_label = Text("顶点(0,0)", font_size=20, color=BLACK) vertex_label.next_to(vertex_dot, DOWN, buff=0.1) # 创建图例 legend_group = VGroup() colors = [BLUE, RED, GREEN] labels = ["a>0", "a<0", "a=0"] styles = [None, None, DashedLine] for i, (color, text, style) in enumerate(zip(colors, labels, styles)): y_pos = self.LEGEND_Y_START - i * 0.8 pos = axes.c2p(self.LEGEND_X, y_pos) if style is DashedLine: line = DashedLine( start=pos + LEFT*0.5, end=pos + RIGHT*0.5, color=color, dash_length=0.1 ) else: line = Line( start=pos + LEFT*0.5, end=pos + RIGHT*0.5, color=color ) text_item = Text(text, font_size=20, color=BLACK) text_item.next_to(line, RIGHT, buff=0.2) legend_item = VGroup(line, text_item) legend_group.add(legend_item) # 动画序列 self.play( Create(axes), Write(axes_labels), Write(title), run_time=2 ) self.wait(0.5) # 绘制第一条抛物线 self.play( Create(graph1), Write(label1), run_time=1.5 ) self.play( Create(vertex_dot), Write(vertex_label), run_time=1 ) self.wait(0.5) # 绘制第二条抛物线 self.play( Create(graph2), Write(label2), run_time=1.5 ) self.wait(0.5) # 绘制第三条抛物线 self.play( Create(graph3), Write(label3), run_time=1.5 ) self.wait(0.5) # 添加图例 self.play( LaggedStart(*[FadeIn(item) for item in legend_group], lag_ratio=0.3), run_time=2 ) self.wait(2) if __name__ == "__main__": # 导入必要的模块 import sys import os # 设置 UTF-8 编码 os.environ['PYTHONIOENCODING'] = 'utf-8' sys.stdout.reconfigure(encoding='utf-8') sys.stderr.reconfigure(encoding='utf-8') # 全局指定 ctex 模板(一次性) config.tex_template = TexTemplateLibrary.ctex # 使用临时配置渲染场景(配置只在with块内有效) with tempconfig({ "quality": "high_quality", "background_color": WHITE, "preview": True }): # 实例化场景类 scene = ParabolaUp() # 执行渲染流程(包含文件生成和预览) scene.render() ```