听说国产AI之光deepseek非常低调地发布了一个小升级,结果就引爆了网上的AI话题,原来这个小升级的AI编程水平达到甚至可能超过了AI编程的王者claude 3.7。AI编程也是我比较感兴趣的领域,之前也试过用AI编程制作教学动画视频。发现claude绝对是最好用的,无论是在理解人类的意图,还是最终编码出的结果可用性,不报错方面都是无与伦比的。这次deepseek3.1升级出来后,也来试试它的编程做动画的能力。结果确实做成功了。至少这方面可以和claude一较高下。
我的题目是让deepseek生成讲解圆面积的推导过程。虽然不是一次成功的,经过了几轮对话反馈了一些错误和问题。就得到下面这个动画了,效果非常棒。
下面是最终生成的代码:
%%manim -qm -v WARNING CircleAreaProof
class CircleAreaProof(Scene):
def construct(self):
# 1. 初始化圆和标记半径
circle = Circle(radius=2, color=WHITE)
radius_line = Line(circle.get_center(), circle.get_right(), color=YELLOW)
radius_label = MathTex("r", color=YELLOW).next_to(radius_line, UP)
self.play(Create(circle), Create(radius_line), Write(radius_label))
self.wait(1)
# 2. 将圆分割成多个扇形(以16份为例)
num_sectors = 16
sectors = VGroup()
colors = [BLUE, GREEN] # 交替颜色
angle_step = 2 * PI / num_sectors
for i in range(num_sectors):
sector = Sector(
radius=2, # 关键修改:使用 radius 而不是 outer_radius
angle=angle_step,
start_angle=i * angle_step,
fill_color=colors[i % 2],
fill_opacity=0.6,
stroke_color=WHITE
)
sectors.add(sector)
self.play(FadeOut(radius_line), FadeOut(radius_label))
self.play(DrawBorderThenFill(sectors), run_time=2)
self.wait(1)
# 3. 展开扇形(分步旋转+平移)
group1 = VGroup(*[sectors[i] for i in range(0, num_sectors, 2)]) # 奇数索引
group2 = VGroup(*[sectors[i] for i in range(1, num_sectors, 2)]) # 偶数索引
# 预计算旋转和位移目标
for i, sector in enumerate(group1):
start_angle = i * 2 * angle_step
sector.target_angle = -PI/2 - start_angle # 逆时针旋转到向右
sector.target_pos = LEFT * 3 + RIGHT * i * angle_step * 2 # 水平排列
for i, sector in enumerate(group2):
start_angle = (i * 2 + 1) * angle_step
sector.target_angle = PI/2 - start_angle # 顺时针旋转到向左
sector.target_pos = LEFT * 3 + RIGHT * i * angle_step * 2 + DOWN * 2 # 下方排列
# 第一步:旋转所有扇形
self.play(
*[Rotate(sector, angle=sector.target_angle, about_point=ORIGIN) for sector in group1],
*[Rotate(sector, angle=sector.target_angle, about_point=ORIGIN) for sector in group2],
run_time=2
)
self.wait(0.5)
# 第二步:平移所有扇形
self.play(
*[sector.animate.move_to(sector.target_pos) for sector in group1],
*[sector.animate.move_to(sector.target_pos) for sector in group2],
run_time=2
)
self.wait(1)
# 4. 拼接成矩形
self.play(
group2.animate.shift(UP * 2.2), # 将绿色组上移
run_time=2
)
self.wait(1)
# 5. 显示矩形的高和长
height_line = DashedLine(
group1[0].get_bottom(), group2[0].get_top(), color=YELLOW
)
height_label = MathTex("r", color=YELLOW).next_to(height_line, RIGHT)
length_line = DashedLine(
group1[0].get_left(), group1[-1].get_right(), color=YELLOW
)
length_label = MathTex(r"\pi r", color=YELLOW).next_to(length_line, DOWN)
self.play(
Create(height_line), Write(height_label),
Create(length_line), Write(length_label),
run_time=1.5
)
self.wait(1)
# 6. 推导面积公式
formula = MathTex(
r"\text{Area} = \pi r \times r = \pi r^2", # 使用英文
color=BLUE
).to_edge(UP)
self.play(Write(formula), run_time=2)
self.wait(2)