核心内容摘要
【独家揭秘】告别付费!“抖漫动漫app免费安装”——你的二次元世界无限畅享新入口!
贝塞尔曲线是由伯恩斯坦基函数定义的参数化多项式曲线核心由控制顶点决定形状阶数与控制顶点数满足顶点数 阶数 1一次2 个顶点、二次3 个顶点、三次4 个顶点。
三者的复杂度、光滑性、造型能力依次提升是 UI 设计、图形学、动画路径等领域的基础一次为直线无曲率二次为抛物线单曲率三次为自由曲线可实现拐点 / 复杂曲率。
本文将分别详细描述各阶贝塞尔曲线的数学定义、几何特性、核心性质并提供Python 可运行代码基于matplotlibnumpy实现曲线 控制多边形 基函数 动态插值过程的可视化绘图直观展示曲线生成逻辑。
通用基础概念
分阶详细描述一一次贝塞尔曲线线性贝塞尔曲线阶数1 阶 | 控制顶点数2 个P0,P1| 曲线形状直线段无弯曲无曲率
数学定义
核心几何特性
典型应用基础线性插值、直线路径绘制、简单动画的线性位移。
绘图示意!在这里插入图片描述一次贝塞尔红色直线段与控制多边形完全重合基函数为两条线性相交的直线无任何弯曲。
二二次贝塞尔曲线抛物线贝塞尔曲线阶数2 阶 | 控制顶点数3 个P0,P1,P2| 曲线形状抛物线单一段光滑曲线1 个曲率方向无拐点
数学定义
核心几何特性
典型应用简单圆角设计UI 按钮、边框、二维简单曲线路径、字体轮廓基础段。
绘图示意二次贝塞尔绿色抛物线在P0处与P0P1相切、P2处与P1P2相切曲线落在三角形凸包内无拐点。
三三次贝塞尔曲线立方贝塞尔曲线阶数3 阶 | 控制顶点数4 个P0,P1,P2,P3| 曲线形状自由光滑曲线可实现拐点、双曲率是工程 / 设计中最常用的阶数
数学定义
核心几何特性
典型应用UI 设计复杂路径、动画缓动曲线、CAD 基础建模、字体设计TrueType/OpenType、游戏角色运动路径、图像处理图像变形。
绘图示意三次贝塞尔品红色自由曲线带有红色星标拐点曲率方向变化在P0处与P0P1相切、P3处与P2P3相切曲线落在四边形凸包内体现了三次曲线的核心造型能力。
代码实现PythonMatplotlib
实现功能绘制一次、二次、三次贝塞尔曲线分 3 个子图对比展示标注控制顶点带编号、控制多边形折线绘制伯恩斯坦基函数曲线辅助理解基函数对顶点的权重标注曲线切线方向端点处直观体现相切特性生成高清矢量图可直接保存使用。
环境准备无需额外安装特殊库Python 内置 基础数据分析库即可pipinstallnumpy matplotlib
完整可运行代码importnumpyasnpimportmatplotlib.pyplotaspltfrommatplotlib.patchesimportFancyArrowPatch# 设置全局样式高清、中文字体、图例/标签大小plt.rcParams[figure.dpi]150plt.rcParams[font.sans-serif][SimHei,DejaVu Sans]plt.rcParams[axes.unicode_minus]Falseplt.rcParams[font.size]10plt.rcParams[legend.fontsize]8# 定义伯恩斯坦基函数defbernstein(n,i,u): 计算n阶贝塞尔曲线的第i个伯恩斯坦基函数值 :param n: 贝塞尔曲线阶数 :param i: 基函数索引0~n :param u: 参数u ∈ [0,1] :return: 基函数值 fromscipy.specialimportcomb# 组合数计算returncomb(n,i)*(u**i)*((1-u)**(n-i))# 定义贝塞尔曲线计算函数defbezier_curve(pts,u): 计算贝塞尔曲线在参数u处的坐标 :param pts: 控制顶点数组shape(n1,
:param u: 参数u ∈ [0,1]标量/数组 :return: 曲线坐标shape(len(u),
npts.shape[0]-1# 阶数顶点数-1unp.atleast_1d(u)pnp.zeros((len(u),
)foriinrange(n
:bbernstein(n,i,u)[:,np.newaxis]pb*pts[i]returnp# 定义绘制切线的函数端点处defplot_tangent(ax,p0,p1,color,label,scale
0.
: 绘制端点处的切线箭头 :param ax: 子图对象 :param p0: 端点坐标 :param p1: 控制点坐标用于计算切线方向 :param color: 箭头颜色 :param label: 箭头标签 :param scale: 箭头长度缩放因子 dir_vec(p1-p
*scale arrowFancyArrowPatch(p0,p0dir_vec,colorcolor,arrowstyle-,mutation_scale8,labellabel)ax.add_patch(arrow)# 生成参数u的采样点密集采样曲线光滑unp.linspace(0,1,
# 定义各阶控制顶点 # 一次贝塞尔2个顶点p1np.array([[0,0],[2,3]])# P0, P1# 二次贝塞尔3个顶点p2np.array([[0,0],[1,3],[3,1]])# P0, P1, P2# 三次贝塞尔4个顶点带拐点体现造型能力p3np.array([[0,0],[1,3],[3,-1],[4,2]])# P0, P1, P2, P3# 计算各阶贝塞尔曲线 c1bezier_curve(p1,u)# 一次曲线c2bezier_curve(p2,u)# 二次曲线c3bezier_curve(p3,u)# 三次曲线# 绘制子图3行1列 fig,(ax1,ax2,ax
plt.subplots(3,1,figsize(8,
,tight_layoutTrue)fig.suptitle(一次、二次、三次贝塞尔曲线 对比,fontsize14,fontweightbold)# -------------------- 子图1一次贝塞尔曲线 --------------------ax
set_title(一次贝塞尔曲线线性2个控制顶点,fontsize
# 绘制控制多边形ax
plot(p1[:,0],p1[:,1],k--,lw1,label控制多边形)# 绘制贝塞尔曲线ax
plot(c1[:,0],c1[:,1],r-,lw2,label一次贝塞尔曲线)# 绘制控制顶点带编号fori,(x,y)inenumerate(p
:ax
scatter(x,y,cblue,s30,zorder
ax
text(x
05,y
05,fP{i},fontsize
# 绘制伯恩斯坦基函数foriinrange(
:bbernstein(1,i,u)ax
plot(u*2,b*3,--,lw
5,labelfB{i},1(u))# 配置子图ax
set_xlabel(X)ax
set_ylabel(Y)ax
legend(locbest)ax
grid(True,alpha
0.
ax
axis(equal)# -------------------- 子图2二次贝塞尔曲线 --------------------ax
set_title(二次贝塞尔曲线抛物线3个控制顶点,fontsize
# 绘制控制多边形ax
plot(p2[:,0],p2[:,1],k--,lw1,label控制多边形)# 绘制贝塞尔曲线ax
plot(c2[:,0],c2[:,1],g-,lw2,label二次贝塞尔曲线)# 绘制控制顶点带编号fori,(x,y)inenumerate(p
:ax
scatter(x,y,cblue,s30,zorder
ax
text(x
05,y
05,fP{i},fontsize
# 绘制端点切线plot_tangent(ax2,p2[0],p2[1],orange,P0处切线)plot_tangent(ax2,p2[-1],p2[-2],purple,P2处切线)# 绘制伯恩斯坦基函数foriinrange(
:bbernstein(2,i,u)ax
plot(u*3,b*3,--,lw
5,labelfB{i},2(u))# 配置子图ax
set_xlabel(X)ax
set_ylabel(Y)ax
legend(locbest)ax
grid(True,alpha
0.
ax
axis(equal)# -------------------- 子图3三次贝塞尔曲线 --------------------ax
set_title(三次贝塞尔曲线自由曲线4个控制顶点带拐点,fontsize
# 绘制控制多边形ax
plot(p3[:,0],p3[:,1],k--,lw1,label控制多边形)# 绘制贝塞尔曲线ax
plot(c3[:,0],c3[:,1],m-,lw2,label三次贝塞尔曲线)# 绘制控制顶点带编号fori,(x,y)inenumerate(p
:ax
scatter(x,y,cblue,s30,zorder
ax
text(x
05,y
05,fP{i},fontsize
# 绘制端点切线plot_tangent(ax3,p3[0],p3[1],orange,P0处切线)plot_tangent(ax3,p3[-1],p3[-2],purple,P3处切线)# 绘制伯恩斯坦基函数foriinrange(
:bbernstein(3,i,u)ax
plot(u*4,b*3,--,lw
5,labelfB{i},3(u))# 标注拐点三次曲线特有ax
scatter(c3[np.argmin(c3[:,1]),0],c3[np.argmin(c3[:,1]),1],cred,s40,marker*,label拐点,zorder
# 配置子图ax
set_xlabel(X)ax
set_ylabel(Y)ax
legend(locbest)ax
grid(True,alpha
0.
ax
axis(equal)# 保存图片可选高清矢量图# plt.savefig(贝塞尔曲线对比.png, dpi300, bbox_inchestight)plt.show()
各阶贝塞尔曲线 核心对比表为了更清晰的对比整理关键维度对比表方便快速查阅特性一次贝塞尔曲线二次贝塞尔曲线三次贝塞尔曲线阶数1 阶2 阶3 阶控制顶点数2 个P0,P13 个P0,P1,P24 个P0,P1,P2,P3曲线形状直线段无曲率抛物线单曲率自由曲线可拐点伯恩斯坦基函数次数一次多项式二次多项式三次多项式端点相切性无自身为直线P0切P0P1P2切P1P2P0切P0P1P3切P2P3曲率变化曲率为 0不变曲率为常数不变曲率连续变化可反向造型能力极弱仅直线弱仅简单弯曲中强工程最优控制难度无难度简单适中典型应用线性插值、直线路径UI 圆角、简单曲线复杂路径、字体设计、CAD 建模4 阶及以上高阶贝塞尔曲线在实际工程和图形系统中极少直接使用通常没有实用价值反而会带来严重问题。
工业界普遍采用「分段低阶贝塞尔曲线」尤其是三次来替代高阶曲线。
结束语关键补充说明凸包性质所有阶数的贝塞尔曲线始终落在控制顶点的凸包内这一性质保证了曲线的可控性调整顶点时曲线不会出现无规律的偏移。
插值与控制贝塞尔曲线仅插值首末顶点中间顶点均为控制点仅影响形状不落在曲线上这是与 B 样条曲线的核心区别之一。
阶数选择原则实际应用中优先使用三次贝塞尔曲线因为一次 / 二次造型能力不足四阶及以上贝塞尔曲线的控制顶点过多修改一个顶点会影响整条曲线无局部控制性控制难度陡增。
多段拼接若单段三次贝塞尔曲线无法满足复杂造型需求可采用多段三次贝塞尔曲线拼接并在拼接点处满足C1/C2 连续性切线 / 曲率连续实现光滑的复杂曲线。
B-样条贝塞尔曲线可以解决很多逼近样条问题但是有一个较为明显的劣势改变其中一个控制点整个曲线都会被影响因此需要B-样条。