贝塞尔曲线(Bezier Curve)原理及公式推导

本文深入讲解了贝塞尔曲线的基本概念,包括其定义、特性和应用。详细解析了一次、二次、三次及n次贝塞尔曲线的公式推导,以及如何通过控制点调整曲线形状。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 定义

贝塞尔曲线(Bezier curve),又称贝兹曲线贝济埃曲线,是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段节点组成,节点是可拖动的支点,线段像可伸缩的皮筋,我们在绘图工具上看到的钢笔工具就是来做这种矢量曲线的。贝塞尔曲线是计算机图形学中相当重要的参数曲线,在一些比较成熟的位图软件中也有贝塞尔曲线工具,如PhotoShop等。

贝塞尔曲线的一些特性:

  • 使用 n n n个控制点 { P 1 , P 2 , . . . , P n } \{P_1,P_2,...,P_n\} {P1,P2,...,Pn}来控制曲线的形状
  • 曲线通过起始点 P 1 P_1 P1和终止点 P n P_n Pn,接近但不通过中间点 P 2 P_2 P2~ P n − 1 P_{n-1} Pn1

2. 直观理解

Step 1. 在二维平面内选三个不同的点并依次用线段连接

在这里插入图片描述

Step 2. 在线段 A B AB AB B C BC BC上找到 D D D E E E两点,使得 A D D B = B E E C \frac{AD}{DB}=\frac{BE}{EC} DBAD=ECBE

在这里插入图片描述

Step 3. 连接 D E DE DE,并在 D E DE DE上找到 F F F点,使其满足 D F F E = A D D B = B E E C \frac{DF}{FE}=\frac{AD}{DB}=\frac{BE}{EC} FEDF=DBAD=ECBE(抛物线的三切线定理)

在这里插入图片描述
Step 4. 找出符合上述条件的所有点

在这里插入图片描述
上述为一个二阶贝塞尔曲线。同样的有 n n n阶贝塞尔曲线:

曲线图示
一阶在这里插入图片描述
三阶在这里插入图片描述
四阶在这里插入图片描述
五阶在这里插入图片描述

3. 公式推导

3.1 一次贝塞尔曲线(线性公式)

定义:给定点 P 0 P_0 P0 P 1 P_1 P1,线性贝塞尔曲线只是一条两点之间的直线,这条线由下式给出,且其等同于线性插值:
B ( t ) = P 0 + ( P 1 − P 0 ) t = ( 1 − t ) P 0 + t P 1 ,   t ∈ [ 0 , 1 ] B(t)=P_0+(P_1-P_0)t=(1-t)P_0+tP_1,\text{ } t\in[0,1] B(t)=P0+(P1P0)t=(1t)P0+tP1, t[0,1]

在这里插入图片描述

其中,公式里的 P 0 P_0 P0 P 1 P_1 P1同步表示为其 x x x y y y轴坐标。

假设 P 0 P_0 P0坐标为 ( a , b ) (a,b) (a,b) P 1 P_1 P1坐标为 ( c , d ) (c,d) (c,d) P 2 P_2 P2坐标为 ( x , y ) (x,y) (x,y),则有:

x − a c − x = t 1 − t ⇒ x = ( 1 − t ) a + t c (3-1) \frac{x-a}{c-x}=\frac{t}{1-t} \Rightarrow x=(1-t)a+tc \tag{3-1} cxxa=1ttx=(1t)a+tc(3-1)

同理有:

y − b d − y = t 1 − t ⇒ y = ( 1 − t ) b + t d (3-2) \frac{y-b}{d-y}=\frac{t}{1-t} \Rightarrow y=(1-t)b+td \tag{3-2} dyyb=1tty=(1t)b+td(3-2)

于是可将 ( 3 − 1 ) ( 3 − 2 ) (3-1) (3-2) (31)(32)简写为:

B ( t ) = ( 1 − t ) P 0 + t P 1 ,   t ∈ [ 0 , 1 ] (3-3) B(t)=(1-t)P_0+tP_1 ,\text{ } t\in[0,1] \tag{3-3} B(t)=(1t)P0+tP1, t[0,1](3-3)

3.2 二次贝塞尔曲线(二次方公式)

定义:二次贝塞尔曲线的路径由给定点 P 0 P_0 P0 P 1 P_1 P1 P 2 P_2 P2的函数 B ( t ) B(t) B(t)给出:
B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 ,   t ∈ [ 0 , 1 ] B(t)=(1-t)^{2} P_0+2t(1-t)P_1+t^2P_2,\text{ } t\in [0,1] B(t)=(1t)2P0+2t(1t)P1+t2P2, t[0,1]

在这里插入图片描述

假设 P 0 P 1 P_0P_1 P0P1上的点为 A A A P 1 P 2 P_1P_2 P1P2上的点为 B B B A B AB AB上的点为 C C C(也即 C C C为曲线上的点。则根据一次贝塞尔曲线公式有:

A = ( 1 − t ) P 0 + t P 1 B = ( 1 − t ) P 1 + t P 2 C = ( 1 − t ) A + t B (3-4) \begin{array}{l} A=(1-t)P_0+tP_1 \\ B=(1-t)P_1+tP_2 \\ C=(1-t)A+tB \end{array} \tag{3-4} A=(1t)P0+tP1B=(1t)P1+tP2C=(1t)A+tB(3-4)

将上式中 A A A B B B带入 C C C中,即可得到二次贝塞尔曲线的公式:

B ( t ) = ( 1 − t ) 2 P 0 + 2 t ( 1 − t ) P 1 + t 2 P 2 ,   t ∈ [ 0 , 1 ] (3-5) B(t)=(1-t)^{2} P_0+2t(1-t)P_1+t^2P_2,\text{ } t\in [0,1] \tag{3-5} B(t)=(1t)2P0+2t(1t)P1+t2P2, t[0,1](3-5)

3.3 三次贝塞尔曲线(三次方公式)

同理可得三次贝塞尔曲线公式:

B ( t ) = ( 1 − t ) 3 P 0 + 3 t ( 1 − t ) 2 P 1 + 3 t 2 ( 1 − t ) P 2 + t 3 P 3 ,   t ∈ [ 0 , 1 ] (3-6) B(t)=(1-t)^{3} P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3,\text{ } t\in [0,1] \tag{3-6} B(t)=(1t)3P0+3t(1t)2P1+3t2(1t)P2+t3P3, t[0,1](3-6)

3.4 n n n次贝塞尔曲线(一般参数公式)

定义:给定点 P 0 , P 1 , . . . , P n P_0,P_1,...,P_n P0,P1,...,Pn,则 n n n次贝塞尔曲线由下式给出:
在这里插入图片描述

n n n次贝塞尔曲线的公式可由如下递归表达:

P 0 n = ( 1 − t ) P 0 n − 1 + t P 1 n − 1 ,   t ∈ [ 0 , 1 ] (3-7) P_0^n=(1-t)P_0^{n-1}+tP_1^{n-1},\text{ }t\in[0,1] \tag{3-7} P0n=(1t)P0n1+tP1n1, t[0,1](3-7)

进一步可以得到贝塞尔曲线的递推计算公式:

P i k { P i ,   k = 0 ( 1 − t ) P i k − 1 + t P i + 1 k − 1 ,   k = 1 , 2 , . . . , n ;   i = 0 , 1 , . . . , n − k P_i^k \begin{cases} P_i , \text{ } k=0 \\ (1-t)P_i^{k-1}+tP_{i+1}^{k-1} , \text{ } k=1,2,...,n; \text{ } i=0,1,...,n-k \end{cases} Pik{Pi, k=0(1t)Pik1+tPi+1k1, k=1,2,...,n; i=0,1,...,nk

这就是德卡斯特里奥算法(De Casteljau’s algorithm)

参考

[1] https://www.jianshu.com/p/0c9b4b681724
[2] https://www.jianshu.com/p/8f82db9556d2

<think>嗯,用户想找关于贝塞尔曲线在凸包避障方面的资料或实现方法,特别是在机器人路径规划中的应用。首先,我需要回顾贝塞尔曲线的基本特性,尤其是凸包性质。贝塞尔曲线的凸包性是指曲线完全位于其控制点形成的凸包内。这对于避障很有用,因为如果能确保控制点的凸包不与环境中的障碍物相交,那么曲线本身也不会与障碍物碰撞。 接下来,我得考虑如何将这一特性应用到路径规划中。通常路径规划会先生成一个初始路径,比如使用A*或Hybrid A*算法生成折线路径,然后将这些路径点作为贝塞尔曲线的控制点。但为了避障,可能需要调整控制点的位置,使得它们的凸包避开障碍物区域。这涉及到优化控制点的位置,可能需要使用优化算法,如梯度下降或遗传算法,来最小化凸包与障碍物的重叠。 然后,用户提到的实现方法可能需要具体的步骤,比如如何检测凸包与障碍物的碰撞,这可以通过计算几何的方法,如分离轴定理(SAT)来检测凸多边形之间的碰撞。另外,动态调整控制点时,需要确保路径的光滑性和动力学可行性,可能需要结合后端优化,比如使用B样条或样条曲线进行进一步的平滑处理。 还需要考虑机器人动力学约束,比如最大速度和加速度,这些在调整控制点间距和曲线曲率时要考虑到。可能需要分段处理贝塞尔曲线,每一段的控制点都满足局部避障要求,同时整体路径保持连续和光滑。 用户可能还关心具体的算法实现,比如如何在编程中实现凸包检测和贝塞尔曲线的生成。可能需要参考现有的路径规划框架,如FAST Planner,它结合了前端路径规划和后端轨迹优化,其中后端可能会用到贝塞尔曲线或B样条曲线。 此外,用户的问题中提到引用[2]和[3],其中提到使用多段贝塞尔曲线组成时空运动轨迹,每一段的起止点是前端路径规划的转折点。因此,实现时需要将前端路径的转折点作为贝塞尔曲线的控制点,并确保这些点的凸包避开障碍物。这可能涉及到在路径规划的前端生成足够多的控制点,或者在后端调整控制点位置以优化凸包形状。 最后,需要验证生成的路径是否满足避障要求,可能通过仿真或实际测试,检查路径是否与障碍物相交,以及机器人的运动是否平滑可行。可能需要调整优化算法的参数,或者在控制点选择上加入更多的约束条件,比如最小曲率半径等。</think>### 贝塞尔曲线凸包避障算法实现 #### 1. 贝塞尔曲线与凸包特性 贝塞尔曲线的凸包性质指:$n$阶贝塞尔曲线始终位于其控制点形成的凸包内部[^1]。利用这一特性,若控制点的凸包避开障碍物,则曲线本身必然避障。 数学表达为: $$B(t) = \sum_{i=0}^n \binom{n}{i} (1-t)^{n-i} t^i P_i \quad (t \in [0,1])$$ 其中$P_i$为控制点,凸包为包含所有$P_i$的最小凸集。 #### 2. 实现步骤 **步骤1:生成初始路径** - 使用Hybrid A*等前端算法生成折线路径,路径转折点作为贝塞尔曲线的分段节点[^3]。 **步骤2:构建凸包约束** - 将每段贝塞尔曲线的控制点$P_0, P_1, ..., P_n$输入凸包检测算法(如Graham扫描法)。 - 计算凸包与障碍物的碰撞检测(如分离轴定理)。 **步骤3:优化控制点** - 若凸包与障碍物相交,通过梯度下降或粒子群算法调整控制点位置,最小化目标函数: $$\min \sum_{i=0}^n \|P_i - Q_i\|^2 + \lambda \cdot \text{障碍物惩罚项}$$ 其中$Q_i$为初始控制点,$\lambda$为权重系数。 **步骤4:轨迹平滑与验证** - 通过B样条或多项式插值对分段贝塞尔曲线进行连接平滑。 - 验证轨迹曲率是否满足机器人运动学约束(如最大转向角)。 #### 3. 代码示例(Python伪代码) ```python # 贝塞尔曲线凸包避障示例 import numpy as np from scipy.spatial import ConvexHull def bezier_convexhull_avoidance(control_points, obstacles): # 计算控制点凸包 hull = ConvexHull(control_points) convex_polygon = control_points[hull.vertices] # 检测凸包与障碍物碰撞 if check_collision(convex_polygon, obstacles): # 优化控制点位置 optimized_points = gradient_descent_optimize(control_points, obstacles) return bezier_curve(optimized_points) else: return bezier_curve(control_points) def check_collision(polygon, obstacles): # 使用分离轴定理检测碰撞 ... ``` #### 4. 关键优化方向 1. **控制点动态调整**:根据障碍物分布实时更新控制点,需平衡计算效率与避障精度[^2]。 2. **多段曲线拼接**:分段贝塞尔曲线需满足$C^2$连续性(位置、速度、加速度连续)。 3. **时空联合规划**:将时间参数引入控制点,实现速度自适应的避障轨迹。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值