191 lines
6.6 KiB
Plaintext
191 lines
6.6 KiB
Plaintext
|
====== 提示词 ======
|
|||
|
|
|||
|
你是一位资深 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()
|
|||
|
```
|