NURBS曲线曲面探索

将NURBS曲线转化为圆锥曲线

在OCCT解析的STEP文件中将NURBS曲线转化为圆锥曲线

整个过程被规划为如下几步:

  • 了解二维圆锥曲线的定义及分类
  • 学习非均匀有理B样条曲线的定义、与圆锥曲线的关系
  • 了解STEP格式中对于NURBS曲线的定义和OCCT对STEP文件解析后暴露的接口
  • 设计算法对结果进行判断
  • 讲曲线的结果推广到有规则几何形状的曲面的判定

存在问题

  • 是否有需要定义空间中的圆锥曲线?如果有需要,那么应该如何定义
    • 0906:应该不需要考虑,通过权系数+控制顶点就可以判断圆锥曲线结构了,另外首先只需要考虑圆弧的情况,其他情况是否要处理再议;
  • 目前对于排查圆弧的想法:先把3控制顶点的下的二次有理Bezier表示圆弧和9点表示圆处理,然后再考虑更一般的情况。直线很好判断,控制顶点数量为2即可
    • 0911:事实上常用来表示圆弧的是四点控制的三次有理Bezier曲线,通过今天新更新的部分内容就可以进行判断了
  • 0911:整圆如何表示及对于更多控制节点的曲线/曲面判断是一个新问题

圆锥曲线

内容摘自wiki

非退化的圆锥曲线共有4类:圆、椭圆、抛物线、双曲线

方程:

  • 圆:$x^2 + y^2 = a^2$
  • 椭圆:$\frac{x^2}{a^2} + \frac{y^2}{b^2} = 1$
  • 抛物线:$y^2 = 4ax$
  • 双曲线:$\frac{x^2}{a^2} - \frac{y^2}{b^2} = 1$

如果用一般方程来表示任意圆锥曲线,则应为

\[Q(x, y) = Ax^2 + Bxy + Cy^2 + Dx + Ey + F = 0\]

其中参数 $A, B, C$ 不得皆等于0。

如果用矩阵的形式来表示,并利用齐次坐标,则应该有

\[\begin{bmatrix} x & y & 1 \end{bmatrix} \begin{bmatrix} A & B/2 & D/2\\ B/2 & C & E/2\\ D/2 & E/2 & F \end{bmatrix} \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = 0\]

记 $A_{33} = \begin{bmatrix} A & B/2
B/2 & C \end{bmatrix},\ A_Q = \begin{bmatrix} A & B/2 & D/2
B/2 & C & E/2
D/2 & E/2 & F \end{bmatrix}$ 。我们可以借助它们来判断圆锥曲线的类型:

  • 若 $\det(A_Q) \ne 0$ ,则圆锥曲线 $Q$ 未退化:
    • 若 $\det(A_{33}) > 0$ ,方程表示一个椭圆:
      • 若 $(A+C)\det(A_Q) < 0$ 时, $Q$ 是一个实椭圆;若 $(A+C)\det(A_Q) > 0$ 时, $Q$ 是一个虚椭圆。
      • 若 $A = C, B = 0$ 且 $D^2 + E^2 - 4AF >0$ 时, $Q$ 表示一个圆。
    • 若 $\det(A_{33}) = 0$ ,方程表示一条抛物线。
    • 若 $\det(A_{33}) < 0$ ,方程表示一条双曲线。
  • 若 $\det(A_Q) = 0$ ,则圆锥曲线 $Q$ 发生退化:
    • 若 $\det(A_{33}) > 0$ ,作为椭圆的退化, $Q$为一个点。
    • 若 $\det(A_{33}) = 0$ ,作为抛物线的退化, $Q$ 为两条平行直线:
      • 若 $D^2 + E^2 > 4(A+C)F$ , $Q$ 为两条不重合的平行直线。
      • 若 $D^2 + E^2 = 4(A+C)F$ , $Q$ 为两条重合的平行直线。
      • 若 $D^2 + E^2 < 4(A+C)F$ , $Q$ 直线不存在于实平面中。
    • 若 $\det(A_{33}) < 0$ ,作为双曲线的退化, $Q$ 为两条相交直线(双曲线的渐近线)。

NURBS曲线的定义

几种NURBS曲线的特例:均匀有理B样条、准均匀有理B样条、分段Bezier曲线

三种等价的NURBS曲线方程表示:

  • 有理分式表示: $k$ 次NURBS曲线可以表示为分段有理多项式矢函数 \(\mathbf{p}(u) = \frac{\sum_{i = 0}^{n}\omega_i\mathbf{d}_iN_{i, k}(u)}{\sum_{i = 0}^{n}\omega_iN_{i, k}(u)} ,\quad 0 \le u \le 1\) 其中权因子 $\omega_i$ 需要满足 $\omega_0, \omega_n > 0$ ,其它 $\omega_i \ge 0$ 但是顺序的 $k$ 个 $\omega_i$ 不同时为 $0$ ; $\mathbf{d}i$ 为控制顶点, $N{i, k}$ 为根据de Boor-Cox 递推公式得到的 $k$ 次规范B样条基函数。
  • 有理基函数表示:用分式表示的NURBS曲线可被改写成如下形式: \(\mathbf{p}(u) = \sum_{i = 0}^n\mathbf{d}_iR_{i, k}(u), \quad 0\le u \le 1 \\ R_{i, k}(u) = \frac{\omega_iN_{i, k}(u)}{\sum_{j = 0}^{n}\omega_jN_{j, k}(u)}\)
  • 齐次坐标表示:如果给定一组控制顶点 $\mathbf{d}_i = [x_i\ y_i]$ 及相联系的权因子 $\omega_i$ ,那么可以按下述步骤定义 $k$ 次NURBS曲线:
    • 确定所给控制顶点 $\mathbf{d}_i$ 的带权控制点: \(\mathbf{D}_i = \begin{bmatrix} \omega_i\mathbf{d}_i&\omega_i \end{bmatrix} = \begin{bmatrix} \omega_ix_i&\omega_iy_i&\omega_i \end{bmatrix}\)
    • 用带权控制顶点 $\mathbf{D}_i$ 定义一条三维的 $k$ 次非有理B样条曲线 \(\mathbf{P}(u) = \sum_{i = 0}^n\mathbf{D}_iN_{i, k}(u)\)
    • 将它投影到 $\omega = 1$ 平面上(注: $\omega \ne 0$ 时 $H{[x\ y\ \omega] = [x/\omega\ y/\omega]}$ ): \(\mathbf{p}(u) = H\{\mathbf{P}(u)\}\)

权因子 $\omega$ 对于曲线形状的影响

借助“在投影变换中共线四点交比具有不变性”这一性质,可以推出如下两条权因子对曲线性质影响的结论:

  • 若固定所有控制顶点及除了 $\omega_i$ 以外的所有其他权因子不变,当 $\omega_i$ 变化时,受其影响的曲线部分 $\mathbf{p}(u_0)$ 点也会随之移动,它在空间中扫描出一条过控制顶点 $\mathbf{d}_i$ 的直线;
  • 当 $\omega_i$ 增大的时候, $\mathbf{p}(u_0)$ 将被拉向 $\mathbf{d}_i$ ;反之,当 $\omega_i$ 减小的时候, $\mathbf{p}(u_0)$ 会被推离 $\mathbf{d}_i$ 。

圆弧的二次NURBS表示

同一段圆弧的NURBS表示不唯一 ,因此不存在一种完美的公式倒推是否为圆弧的方法;但是通过“控制顶点+基函数+权系数”的组合反过来判断每条NURBS是否是圆弧的方法也很不现实,原因在于基函数的类型太多了。但是考虑到数模是通过设计软件产生的,因此不存在过于复杂的圆弧表示结构。通过观察stp文件的实际存储格式,结合几篇论文中的结果以及书籍中的定义,总结出了如下几种常用的用于表示圆弧/整个圆的曲线:

  • 由三个控制点决定的二次有理Bezier曲线;
  • 由四个控制点决定的三次有理Bezier曲线;
  • 整圆(待更新,目前了解到的有9点与7点格式)

三个控制点决定的有理二次Bezier曲线

如果给定三个控制点 $\mathbf{b}_0, \mathbf{b}_1, \mathbf{b}_2$ 及相联系的三个权因子 $\omega_0, \omega_1, \omega_2$ ,即可得到有理二次Bezier曲线的表示形式:

\[\mathbf{p} = \mathbf{p}(u) = \frac{(1 - u)^2\omega_0\mathbf{b}_0 + 2u(1 - u)\omega_1\mathbf{b}_1 + u^2\omega_2\mathbf{b}_2}{(1 - u)^2\omega_0 + 2u(1 - u)\omega_1 + u^2\omega_2}, \quad 0 \le u \le 1\]

具体对应的圆锥曲线类型则应当考察分母部分 $\omega(u) = (\omega_0 - 2\omega_1 + \omega_2)u^2 + 2(\omega_1 - \omega_0)u + \omega_0$ 的结构,讨论判别式的正负从而确定是哪种圆锥曲线。在标准情况下 $\omega_0 = \omega_2 = 1$ ,因此此时只需要对 $\omega_1$ 进行讨论:

  • $\omega_1^2 < 1 \Rightarrow$ 椭圆
  • $\omega_1^2 = 1 \Rightarrow$ 抛物线
  • $\omega_1^2 > 1 \Rightarrow$ 双曲线

对于圆弧,由于对称性的要求及弦切角定理,可以推出当 $\omega_1 = \cos \theta$ 时曲线为圆弧,其中 $\theta = \angle \mathbf{b}_0\mathbf{b}_1\mathbf{b}_2 / 2$ (详细证明见The NURBS Book中的7.3节)。

四个控制点决定的有理三次Bezier曲线

这种情况其实可以看做是对前一种情况的加点升阶操作,通过充要条件的判定就可以判断是否为圆弧,(具体内容见 计算机辅助几何设计与非均匀有理B样条(修订版)一书10.4节):

假定四个控制点分别为 $\mathbf{d}_0, \mathbf{d}_1, \mathbf{d}_2, \mathbf{d}_3$ ,对应的权系数为 $\omega_0, \omega_1, \omega_2, \omega_3$ 则由其表示的三次有理Bezier曲线是张角为 $0 < \theta < 4\pi/3$ 的圆弧的充要条件是:

  • 四个控制点共面;
  • $\angle \mathbf{d}_1\mathbf{d}_0\mathbf{d}_3 = \angle \mathbf{d}_2\mathbf{d}_3\mathbf{d}_0 = \theta/2 \in (0, 2\pi/3)$;
  • $( \mathbf{d}_0\mathbf{d}_3 - 2 \mathbf{d}_0\mathbf{d}_1 \cos(\theta/2))( \mathbf{d}_0\mathbf{d}_3 - 2 \mathbf{d}_2\mathbf{d}_3 \cos(\theta/2)) = \mathbf{d}_0\mathbf{d}_1   \mathbf{d}_2\mathbf{d}_3 $
  • $\frac{ \mathbf{d}_0\mathbf{d}_3 ( \mathbf{d}_0\mathbf{d}_3 - 2 \mathbf{d}_2\mathbf{d}_3 \cos(\theta/2))}{3 \mathbf{d}_0\mathbf{d}_1 ^2} = \frac{\omega_1^2}{\omega_0\omega_2}$
  • $\frac{ \mathbf{d}_0\mathbf{d}_3 ( \mathbf{d}_0\mathbf{d}_3 - 2 \mathbf{d}_0\mathbf{d}_1 \cos(\theta/2))}{3 \mathbf{d}_2\mathbf{d}_3 ^2} = \frac{\omega_2^2}{\omega_1\omega_3}$

此外,因为有理三次Bezier曲线是可以表示半圆的,因此可以用6个点,分成两组四点的有理三次Bezier曲线来表示一整个圆,其中两个圆上的点被两组曲线共用。

STEP文件中NURBS曲线的表示格式

STEP中提供了NURBS的参数

NURBS曲面的基础知识

同NURBS相比,NURBS曲面增加的内容并不算多,只需要考虑成沿两个方向的曲线族即可。严格的曲面定义为:

\[\mathbf{p}(u, v) = \frac{\sum_{i = 0}^{m}\sum_{j = 0}^{n}\omega_{ij}\mathbf{d}_{ij}N_{i, k}(u)N_{j, l}(v)}{\sum_{i = 0}^{m}\sum_{j = 0}^{n}\omega_{ij}N_{i, k}(u)N_{j, l}(v)}, \quad 0\le u, v\le 1\]

同样的,用来如果是用来描述平面、圆锥曲面、球面的话,最多只需要用到双三次有理Bezier曲面即可,控制点数量也只需要到达最低标准即可。

通过分析 $u-v$ 方向的曲线属于哪种基本曲线,就可以判断出来得到的曲面结构:

  • 直线+直线:平面
  • 直线+圆:圆柱
  • 圆+圆:球

可以用直纹面来表示平面、圆柱或圆锥

相关论文内容整理

  • Representing quadric surfaces using NURBS surfaces 这篇文章介绍了如何通过旋转NURBS曲线的方法构造二次曲面,并提供了算法,通过先确定 $v$ 方向的曲线控制点 $\mathbf{V}{0j}$ ,基函数 $N{j, q}(v)$ 和各点权重 $h_j$,然后沿轴旋转从 $\mathbf{V}{0j}$ 上各点得到对应圆弧,确定各自的NURBS曲线控制点 $\mathbf{V}{i, j}$ ,基函数 $N_{p, i}(u)$ 和各点权重 $H_i$ 。组合起来之后就得到了旋转面的NURBS表示(这样操作的保证在于NURBS曲线存在仿射不变性:可以通过对控制点进行仿射变换实现对曲线各点相同的仿射变换): \(\mathbf{p}(u, v) = \frac{\sum_{i = 0}^{m}\sum_{j = 0}^{n}H_ih_j\mathbf{V}_{ij}N_{i, q}(u)N_{p, j}(v)}{\sum_{i = 0}^{m}\sum_{j = 0}^{n}\mathbf{V}_{ij}N_{i, q}(u)N_{p, j}(v)}\)
  • The rational cubic Bezier representation of conics 这篇文章介绍了如何用有理三次Bezier曲线来表示圆锥曲线,在预备知识部分回顾了表示圆锥曲线的有理二次Bezier曲线和有理三次Bezier曲线的相互转换,之后提出了一个有理三次样条曲线是圆锥曲线的必要条件和一个充要条件。
  • Higher order Bezier circles