非函数型B样条曲线的控制点-基函数组合表达方法问询
从Hughes的开创性论文中,我了解到任意B样条曲线(或曲面)可表示为B样条基函数与控制点的线性组合,即:
$$
C(x) = \sum_{i=1}^n N_{i,p} B_i
$$
其中$N_{i,p}$表示p阶B样条的第i个基函数,$B_i$为系数(即控制点)。该形式在预定义平面上可有效生成目标B样条曲线/曲面。
我的问题是:是否存在方法以相同形式表达非函数型B样条曲线(即竖直线可与曲线存在多个交点)?例如,如何用上述形式表达下图中的曲线?

该曲线包含垂直与水平段,且两者均带有锯齿(分别存在竖直线/水平线与曲线交于两点的情况)。显然这类非函数型曲线无法直接分解为上述基函数形式,特此询问如何用相同形式对其进行显式表达,解析与数值表达方案均可。感谢解答!
当然可以用类似的线性组合形式表达这类非函数型B样条曲线,核心是将曲线定义为参数化形式,而非关于x的单值函数:
1. 参数化B样条曲线的标准形式
你提到的$C(x) = \sum_{i=1}^n N_{i,p} B_i$是单变量函数形式的B样条,仅适用于函数型曲线(每个x对应唯一y)。而通用的平面B样条曲线是参数化曲线,形式为:
$$
C(t) = \sum_{i=1}^n N_{i,p}(t) P_i
$$
其中:
- $t$是参数,取值于节点区间$[t_p, t_{n+1}]$
- $N_{i,p}(t)$是p阶B样条基函数,由节点向量定义
- $P_i = (x_i, y_i)$是二维控制点(而非单值系数)
这种参数化形式完全支持非函数型曲线,包括你图中的带垂直段、多交点的曲线——因为x和y都是参数t的函数,$x(t)$和$y(t)$各自独立由基函数组合生成,不存在“一个x对应多个y”的限制。
2. 针对示例曲线的实现思路
对于图中包含垂直/水平锯齿段的曲线,可按以下步骤构建:
- 确定节点向量:根据曲线的分段特性(比如垂直段、水平段的起止),设置节点向量以保证基函数在对应区间的连续性(比如0阶/1阶连续,实现折线状的锯齿)。
- 设置二维控制点:逐段定义控制点$(x_i,y_i)$,让参数t在不同区间时,$C(t)$生成垂直或水平的锯齿段。例如,垂直段对应x值固定、y随t变化的控制点组;水平段则对应y值固定、x随t变化的控制点组。
- 基函数计算:使用de Boor算法计算各参数t对应的基函数值,进而得到曲线的$(x,y)$坐标。
3. 数值与解析表达的可行性
- 解析表达:如果节点向量和控制点已知,可直接写出$x(t) = \sum N_{i,p}(t)x_i$和$y(t) = \sum N_{i,p}(t)y_i$的解析式,其中$N_{i,p}(t)$可通过Cox-de Boor递推公式展开。
- 数值表达:通过离散参数t的取值(比如t从0到1均匀采样),计算每个t对应的$(x,y)$坐标,即可得到曲线的数值点集,用于绘图或后续计算。
简单来说,只要把原形式中的单值系数$B_i$换成二维控制点$P_i$,把自变量x换成通用参数t,就能用完全类似的线性组合形式表达任意非函数型B样条曲线。
内容的提问来源于stack exchange,提问作者ARessegetes_Stery

