痛点场景还原

发布时间:2026/7/10 7:59:02
痛点场景还原 假设做一个最经典的追及动画甲从原点出发速度v12乙从x10处同向出发速度v25问多久追上。如果用纯手工方式写 Manimclass PainfulCatchUp(Scene):def construct(self):# 手动列方程并求解# 设 t 为乙出发后的时间甲的位置2*(t?)乙的位置105*t# 如果同时出发2t 105t → t -10/3 负数无意义# 改甲先出发2秒2(t2) 105t → 2t4105t → -3t6 → t-2 还是负# 必须反复调整题设手算满足实际情况的初始条件# 这里干脆让乙追甲甲在乙前面# 甲在x10以v2向前乙在x0以v5同时出发 → 5t 102t → 3t10 → t10/3v1, v2 2, 5t_meet 10/3 # 手动解出的结果meet_x 5 * t_meet # 再手动算相遇位置# 甲和乙的轨迹只能硬编码 def pos1(t): return 10 v1 * t def pos2(t): return v2 * t # 然后创建动画……痛点很明显每次改变速度或初始距离都要重新手写方程、求解、算相遇坐标。题目条件稍微变化比如“甲先走1分钟”、“乙在中途休息”手算的过程就得全部推翻重来。容易在单位换算、正方向等细节上出错动画一旦跑起来发现不对排查起来也费劲。这些计算本质上就是根据文字描述建立代数方程并求解正是 SymPy 最擅长的事。SymPy 解决方案介绍SymPy 可以让我们用符号把追及问题“翻译”成方程然后自动求解。import sympy as sp符号定义t 为乙出发后经过的时间t sp.symbols(‘t’, positiveTrue)v1, v2 2, 5 # 速度s0 10 # 初始距离甲在乙前面10米甲的位置先出发0秒即同时出发位置 s0 v1*tpos1 s0 v1 * t乙的位置从0开始位置 v2*tpos2 v2 * t相遇条件位置相等eq sp.Eq(pos1, pos2)solution sp.solve(eq, t)输出: [10/3]如果甲先出发 2 秒方程只需改一下t_delay 2 # 甲早出发2秒pos1 s0 v1 * (t t_delay) # 甲多走2秒eq sp.Eq(pos1, pos2)solution sp.solve(eq, t)输出: [14/3]无论怎么变化我们只需要修改符号表达式的构建逻辑求解交给 solve相遇坐标直接代入即可。接下来把这个思想嵌入 Manim动画就能自适应任意追及条件。