You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 00:10:23