如何在Manim中创建经过指定点的平滑闭合曲线?
如何在Manim中创建经过指定点的平滑闭合曲线?
嗨,我来帮你搞定这个问题!你遇到的首尾尖角问题,是因为make_smooth()默认没把闭合路径的首尾当成连续的曲线来处理——它只平滑了中间的转折,却忽略了起点和终点的衔接。这里有两种简单的解决办法:
方法一:用CatmullRomCurve(推荐)
Manim自带的CatmullRomCurve就是专门用来生成平滑样条曲线的,而且原生支持闭合路径,代码写起来更简洁,效果也更稳定:
from manim import * class Help(Scene): def construct(self): points = ((-3, 2, 0), (-1, 0, 0), (-4, -2, 0), (-5, 0, 0)) # closed=True 让曲线自动首尾平滑衔接,tension控制曲线松紧(可按需调整) redCurve = CatmullRomCurve(points, closed=True, tension=0.8) redCurve.set_color(RED) self.play(Create(redCurve)) self.wait(3)
tension参数可以调整曲线的弯曲程度,数值越小曲线越“紧绷”,越大则越“松弛”,0.8是比较自然的默认值,你可以多试几个数值找到自己喜欢的效果。
方法二:调整VMobject的平滑逻辑
如果你更习惯用VMobject的工作流,只需要稍微修改一下点的处理逻辑,让make_smooth()意识到这是个闭合路径:
from manim import * class Help(Scene): def construct(self): points = ((-3, 2, 0), (-1, 0, 0), (-4, -2, 0), (-5, 0, 0)) # 把第一个点重复添加到列表末尾,让平滑算法能处理首尾衔接 extended_points = list(points) + [points[0]] redCurve = VMobject(color=RED) redCurve.set_points_as_corners(extended_points) # 指定closed=True,告诉make_smooth这是闭合路径 redCurve.make_smooth(closed=True) self.play(Create(redCurve)) self.wait(3)
这样修改后,make_smooth()就会把首尾的点当成连续的曲线段来处理,尖角自然就消失啦。
两种方法都能解决你的问题,个人更推荐第一种,因为代码更简洁,曲线的平滑度也更容易控制~
备注:内容来源于stack exchange,提问作者Caleb Keller
相关产品推荐
相关产品推荐

