在Manim中绘制高阶贝塞尔曲线的技术求助
在Manim中绘制高阶贝塞尔曲线的解决方案
方法一:正确使用内置的bezier函数
Manim的bezier函数本身支持任意数量的控制点,它返回的是一个参数化的曲线函数,你需要配合ParametricFunction来完成绘制。以下是示例代码:
from manim import * class HighOrderBezier(Scene): def construct(self): # 定义5个控制点(可任意扩展数量) points = [ np.array([-3, -2, 0]), np.array([-1, 2, 0]), np.array([1, -2, 0]), np.array([3, 2, 0]), np.array([5, -2, 0]) ] # 用bezier生成参数化函数 bezier_func = bezier(points) # 创建参数化曲线并添加到场景 curve = ParametricFunction(bezier_func, t_range=[0, 1], color=BLUE) self.add(curve) # 可选:绘制控制点 dots = VGroup(*[Dot(point, color=RED) for point in points]) self.add(dots)
方法二:自定义高阶贝塞尔曲线类
如果需要更灵活的控制(比如实时调整控制点、添加动画),可以基于德卡斯特里奥算法实现自定义类:
from manim import * class HighOrderBezierCurve(VMobject): def __init__(self, points, **kwargs): super().__init__(**kwargs) self.points = points self.generate_points() def generate_points(self): # 德卡斯特里奥算法计算曲线上的点 def de_casteljau(t): temp_points = self.points.copy() n = len(temp_points) for k in range(1, n): for i in range(n - k): temp_points[i] = (1 - t) * temp_points[i] + t * temp_points[i + 1] return temp_points[0] # 采样生成平滑曲线点 t_values = np.linspace(0, 1, 100) self.set_points_smoothly([de_casteljau(t) for t in t_values]) class CustomBezierScene(Scene): def construct(self): points = [ np.array([-4, -1, 0]), np.array([-2, 3, 0]), np.array([0, -2, 0]), np.array([2, 3, 0]), np.array([4, -1, 0]), np.array([6, 2, 0]) ] curve = HighOrderBezierCurve(points, color=GREEN) self.add(curve) self.add(VGroup(*[Dot(p) for p in points]))
失败原因说明
你之前用bezier函数没成功,大概率是因为没把它返回的参数化函数传入ParametricFunction——bezier本身只是生成计算曲线的逻辑,不会直接创建可显示的图形对象,必须配合ParametricFunction才能渲染到场景中。
内容的提问来源于stack exchange,提问作者Felix B
相关产品推荐
相关产品推荐

