核心内容摘要
17岁初中生免费播放电视剧国产
首先贝塞尔曲线 ⊂ B - 样条曲线 ⊂ NURBS 曲线三者是层层包含、逐步泛化的关系NURBS 曲线是前两者的通用形式能够兼容表示贝塞尔曲线和 B - 样条曲线。
先明确核心定义逼近样条曲线Spline是一组分段光滑、在连接点处满足一定连续性条件通常是 C¹、C² 连续的曲线段的集合最初源于工程绘图中用「样条尺」绘制的光滑曲线后来被数学建模为参数化曲线核心目的是用简单的数学表达式拟合复杂的光滑轮廓。
参数化样条曲线的通用形式其中u为参数Pi为控制顶点Ni,k(u)为基函数三种曲线的核心区别就是基函数的类型和约束条件不同。
贝塞尔曲线Bezier Curve核心定义一种无节点或说节点固定的参数化多项式曲线由一组控制顶点P0,P1,…,Pnn为阶数通常说的 n 次贝塞尔曲线定义基函数为伯恩斯坦多项式Bernstein Polynomial。
数学表达式n 次贝塞尔曲线关键约束局限性控制顶点数 阶数 1n 次曲线对应 n1 个控制顶点阶数过高时曲线难以控制。
无局部控制性修改任意一个控制顶点都会影响整条曲线的形状。
参数区间固定为[0,1]仅能表示单段光滑曲线。
曲线必然经过首末两个控制顶点P(
P0P(
Pn且与首末控制边相切。
B - 样条曲线B-Spline Curve核心定义对贝塞尔曲线的泛化引入节点向量Knot Vector基函数为B 样条基函数由德布尔 - 考克斯递推公式定义支持分段定义曲线解决了贝塞尔曲线无局部控制性的问题。
数学表达式关键约束相对于贝塞尔曲线的改进引入节点向量节点将参数区间划分为多个子区间每个子区间对应一段曲线仅由相邻的k个控制顶点决定。
局部控制性修改某个控制顶点仅影响曲线的局部一段相邻k个节点区间对应的曲线段。
支持多段光滑拼接连续性由阶数k和节点重复度决定节点重复度≤k时可保证Ck−r−1连续r为节点重复度。
可以兼容表示贝塞尔曲线满足特定节点向量约束即可。
NURBS 曲线Non-Uniform Rational B-Spline Curve核心定义对 B - 样条曲线的进一步泛化引入权因子Weight基函数为有理 B 样条基函数解决了 B 样条曲线无法精确表示圆锥曲线圆、椭圆、抛物线、双曲线的问题。
数学表达式关键约束相对于 B - 样条曲线的改进引入权因子当所有权因子wi1时退化为普通 B - 样条曲线。
可精确表示圆锥曲线和初等曲面贝塞尔、B - 样条仅能近似表示。
保持 B - 样条曲线的局部控制性、分段光滑性等所有优点。
是计算机辅助设计CAD、图形学中的标准曲线表示方法如 AutoCAD、UG 等软件均采用。
三者的包含关系与转换条目化核心重点
包含关系层层泛化从特殊到一般贝塞尔曲线 ⊂ B-样条曲线 ⊂ NURBS曲线具体对应关系曲线类型能否被后续曲线兼容表示兼容条件核心贝塞尔曲线能被 B - 样条曲线表示
节点向量采用「夹紧节点」首末节点重复k次
节点数mnkn为贝塞尔控制顶点数 - 1k为 B 样条阶数 贝塞尔阶数贝塞尔曲线能被 NURBS 曲线表示满足 B - 样条兼容条件 所有权因子wi1B - 样条曲线能被 NURBS 曲线表示所有权因子wi1有理部分退化为 1即为普通 B - 样条
具体转换方法条目化可落地1贝塞尔曲线 → B - 样条曲线2B - 样条曲线 → NURBS 曲线3贝塞尔曲线 → NURBS 曲线4特殊说明反向转换NURBS→B - 样条→贝塞尔
代码示例使用 Python 的geomdl库专业几何建模库
环境准备geomdl是专门用于几何建模曲线、曲面的 Python 库完美支持贝塞尔、B - 样条、NURBS 曲线的定义和转换先安装pipinstallgeomdl
代码示例三者的定义、转换与可视化fromgeomdlimportBSpline,NURBS,Bezierfromgeomdlimportutilitiesfromgeomdl.visualizationimportVisMPL# # 示例1定义贝塞尔曲线3次4个控制顶点# print( 步骤1定义3次贝塞尔曲线 )bezier_curveBezier.Curve()# 设置阶数3次对应4个控制顶点bezier_curve.degree3# 设置控制顶点二维平面点可改为三维control_points_bezier[(
0,
0.
,# P0(
0,
3.
,# P1(
0,
4.
,# P2(
0,
2.
# P3]bezier_curve.ctrlptscontrol_points_bezier# 自动生成参数区间贝塞尔默认[0,1]bezier_curve.knotvectorutilities.generate_knot_vector(bezier_curve.degree,len(bezier_curve.ctrlpts))# 采样曲线点用于可视化增加采样数使曲线更光滑bezier_curve.sample_size100# # 示例2贝塞尔曲线 → B-样条曲线按转换规则# print(\n 步骤2贝塞尔曲线转换为B-样条曲线 )bspline_curveBSpline.Curve()#
复用贝塞尔的阶数bspline_curve.degreebezier_curve.degree#
复用贝塞尔的控制顶点bspline_curve.ctrlptsbezier_curve.ctrlpts#
构造夹紧节点向量与贝塞尔的knotvector一致geomdl已自动支持bspline_curve.knotvectorbezier_curve.knotvector# 采样曲线点bspline_curve.sample_size100# # 示例3B-样条曲线 → NURBS曲线按转换规则# print(\n 步骤3B-样条曲线转换为NURBS曲线 )nurbs_curveNURBS.Curve()#
复用B-样条的阶数nurbs_curve.degreebspline_curve.degree#
复用B-样条的控制顶点nurbs_curve.ctrlptsbspline_curve.ctrlpts#
复用B-样条的节点向量nurbs_curve.knotvectorbspline_curve.knotvector#
分配权因子w_i1所有控制顶点权值为1nurbs_curve.weights[
0for_inrange(len(nurbs_curve.ctrlpts))]# 采样曲线点nurbs_curve.sample_size100# # 示例4验证三者的一致性输出关键信息# print(\n 步骤4验证三者的核心参数一致性 )print(f贝塞尔曲线阶数{bezier_curve.degree})print(fB-样条曲线阶数{bspline_curve.degree})print(fNURBS曲线阶数{nurbs_curve.degree})print(f贝塞尔控制顶点数{len(bezier_curve.ctrlpts)})print(fB-样条控制顶点数{len(bspline_curve.ctrlpts)})print(fNURBS控制顶点数{len(nurbs_curve.ctrlpts)})print(f贝塞尔节点向量{bezier_curve.knotvector})print(fB-样条节点向量{bspline_curve.knotvector})print(fNURBS节点向量{nurbs_curve.knotvector})print(fNURBS权因子{nurbs_curve.weights})# # 示例5可视化三条曲线重合验证转换正确性# print(\n 步骤5可视化三条曲线将弹出绘图窗口 )# 合并三条曲线用于批量可视化fromgeomdlimportMultiCurve multi_curveMultiCurve()multi_curve.add(bezier_curve)multi_curve.add(bspline_curve)multi_curve.add(nurbs_curve)# 设置可视化样式multi_curve.visVisMPL.VisCurve2D()multi_curve.render()# # 示例6NURBS曲线的扩展修改权因子体现其优势# print(\n 步骤6修改NURBS权因子展示其灵活性 )# 复制原NURBS曲线修改第二个控制顶点的权因子nurbs_curve_modifiedNURBS.Curve()nurbs_curve_modified.degreenurbs_curve.degree nurbs_curve_modified.ctrlptsnurbs_curve.ctrlpts nurbs_curve_modified.knotvectornurbs_curve.knotvector# 修改第二个控制顶点的权因子为
0其余保持
0nurbs_curve_modified.weights[
0,
0,
0,
0]nurbs_curve_modified.sample_size100# 可视化修改后的NURBS曲线与原曲线对比multi_curve_modifiedMultiCurve()multi_curve_modified.add(nurbs_curve)multi_curve_modified.add(nurbs_curve_modified)multi_curve_modified.visVisMPL.VisCurve2D()multi_curve_modified.render()
代码运行结果说明
补充关键知识点拓展条目化
结束语三者是特殊到一般的层层泛化关系贝塞尔曲线⊂B - 样条曲线⊂NURBS 曲线核心区别在于基函数和约束条件的不同。
转换的核心是复用核心参数阶数、控制顶点、节点向量 满足兼容条件夹紧节点、权因子全 1贝塞尔可直接转为 B - 样条B - 样条可直接转为 NURBS。
NURBS 曲线是功能最强大的通用形式兼具局部控制性和精确表示圆锥曲线的能力是工程和图形学的主流选择而geomdl库是实现三者定义、转换和可视化的高效工具。