01-CAD中曲线、曲面的表达

01-CAD中曲线、曲面的表达

本文属于 “NURBS学习笔记” 专栏,更多文章可以点击↓↓↓
NURBS学习笔记专栏

计算机辅助设计,即借助计算机的各类输入方便设计者进行设计意图的表达、修改、存储等。这个过程中最为重要的即要采取合适的方法将要设计的模型数据在计算机中进行表达。模型数据根据设计领域的不同而有不同形式,但作为真实世界的模拟,最为主要的还是三维模型数据。怎么在计算机中表示一个三维实体模型?

什么是三维实体模型?《计算机科学技术名词 》给出的答案是:三维物体完整 几何拓扑 信息的模型。几何信息容易理解,就是一些点线面;拓扑信息又为何物?我们可以想象简单立方体这样一个模型,它的6张面容易被表达出来:我们可以用解析几何里的点法式再辅以各个坐标的取值范围即可。仅有这6张面能够说是实体吗?我们想象有一只蚂蚁,它能够在实体的同一组表面(如果立方体内还有个空腔,那就是两组表面了)上的任意两点间穿梭。可是蚂蚁从某点出发后,走到了该点所在平面的边缘就傻眼了,它不知道接下来要去哪里。尽管从6张平面的实际空间表达来看,你“知道”与该平面相连的下一张平面是谁,但是“计算机”不知道,这只“蚂蚁”也不知道。这个例子中所缺的曲面间的连接关系即是拓扑信息。更进一步地讲,点-线关系,线-面关系等等共同构成了拓扑信息。

“三维物体完整几何和拓扑信息”中的完整又该如何理解呢?试想:这只“蚂蚁”可以永无倦怠地在模型某个表面上随机游走,能够根据“几何”信息到达某张面、某条线的边缘;也能够根据“拓扑”信息识图判向,在边缘处无缝穿越到下一条线、下一张面。能够永久困住这只蚂蚁的一组几何和拓扑信息即是完整的。我们所处的真实世界里的模型都将困死一只蚂蚁,但在虚拟世界,单独的不封闭的线条、缺了一张面的立方体都将被这只蚂蚁探索到“边缘”,也就不是完整的了。

但也并不是说在CAD领域里模型的表达就必须同时有这两套信息。试想CATIA、NX等软件的使用过程,这些通用CAD软件都会提供“实体造型”和“曲线曲面造型”功能。“实体造型”过程中,我们基于草图拉伸、旋转、放样出实体,然后可以通过实体间的布尔运算得到新的实体,也可以对实体添加诸如倒/圆角、拔模、抽壳等修饰特征。一旦基于草图创建出实体,那么后续的模型都将以实体的形式出现,内核就要实时维护好几何和拓扑信息。另一方面,“曲线曲面造型”功能允许我们自由地创建线/面,在整个创建过程中的模型都是不完整的,在这种情况下,拓扑信息也就没有维护的必要了(局部的某些拓扑信息也可以得到,比如两张曲面进行互相裁剪,那么就可以在局部维护到交线-面1、交线-面2的相邻关系)。

从上面的分析可以看出,无论是采用了哪种模型的表达方式,几何信息都是最基本、最重要的,本系列博客将把重心放在此处。

那么几何对象(点、线、面)在计算机中又是如何表达的呢?我们可以从多个角度对其表达方式进行分类。

根据数据是否离散,分为 离散 几何对象和 连续 几何对象,离散几何对象就是我们常用的STL文件、体素模型、游戏中的模型素材等;我们使用各类CAD软件创建的圆弧曲线、B样条曲面等就是连续几何对象。此种分类类比二维的图像和图形,可以一直放大而不失真的即为连续几何对象。在传统的CAD领域中,我们更多地关注连续几何对象,这更多地是为了满足高加工精度、小文件存储、容易交互设计的需要;但是离散几何对象也会涉及到,尤其是在影视游戏建模、增材制造、物理仿真等领域。

连续几何对象又可分为 显式(Implicit)隐式(Explicit) 两种,本文即按这种分类方式对 连续 的几何对象进行讲解。

1. 曲线和曲面的显式(参数)表示

简单来讲,显式表示 即通过参数映射给出所有的点,这种方法一般使用向量函数(也称为 矢函数 )的形式来表示。如公式 C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) C ( t ) \color{green}\mathbf{C}\left(t\right) C(t)都表示了一个位于第一象限的四分之一圆弧; S ( u , v ) \mathbf{S}\left(u,v\right) S(u,v)表示了整个圆球面。

C ( u ) = { x ( u ) = cos ⁡ ( u ) y ( u ) = sin ⁡ ( u ) 0 ≤ u ≤ π 2 (1) \color{red}\mathbf{C}\left(u\right)=\left\{ \begin{matrix} \begin{aligned} x\left(u\right)&=\cos\left(u\right) \\ y\left(u\right)&=\sin\left(u\right) \end{aligned}\end{matrix}\right. \quad 0\le u\le\frac{\pi}{2} \tag{1} C(u)={x(u)y(u)=cos(u)=sin(u)0u2π(1)

C ( t ) = { x ( t ) = 1 − t 2 1 + t 2 y ( t ) = 2 t 1 + t 2 0 ≤ t ≤ 1 (2) \color{green}\mathbf{C}\left(t\right)=\left\{\begin{matrix}\begin{aligned} x\left(t\right)&=\frac{1-t^2}{1+t^2} \\ y\left(t\right)&=\frac{2t}{1+t^2} \end{aligned}\end{matrix}\right. \quad 0\le t\le 1 \tag{2} C(t)= x(t)y(t)=1+t21t2=1+t22t0t1(2)

S ( u , v ) = { x ( u , v ) = sin ⁡ ( u ) cos ⁡ ( v ) y ( u , v ) = sin ⁡ ( u ) sin ⁡ ( v ) z ( u , v ) = cos ⁡ ( u ) 0 ≤ u ≤ π , 0 ≤ v ≤ 2 π (3) \mathbf{S}\left(u,v\right)=\left\{\begin{matrix}\begin{aligned} x\left(u,v\right)&=\sin\left(u\right)\cos\left(v\right) \\ y\left(u,v\right)&=\sin\left(u\right)\sin\left(v\right) \\ z\left(u,v\right)&=\cos\left(u\right) \end{aligned} \end{matrix} \right. \quad 0\le u\le\pi,0\le v\le 2\pi \tag{3} S(u,v)= x(u,v)y(u,v)z(u,v)=sin(u)cos(v)=sin(u)sin(v)=cos(u)0uπ,0v2π(3)

有些教材将形如公式 ( 4 ) \left(4\right) (4)的表达称之为显式表示,而将公式 ( 1 − 3 ) \left(1-3\right) (13)的表达称之为参数表示。实际上,这种分类下的显示表达只是参数表达的一种特殊形式,如公式 ( 4 ) \left(4\right) (4)可以引入一个参数 p = x p=x p=x,则得到公式 ( 5 ) \left(5\right) (5),这也是一个参数表示。所以我们今后所言显式表示一般指向量函数表示的曲线、曲面,而默认将公式 ( 4 ) \left(4\right) (4)这种表示认为也是一种特殊的参数表示。

y = 1 − x 2 0 ≤ x ≤ 1 (4) y=\sqrt{1-x^2} \quad 0\le x \le 1 \tag{4} y=1x2 0x1(4)

C ( p ) = { x ( p ) = p y ( p ) = 1 − p 2 0 ≤ p ≤ 1 (5) \color{blue}\mathbf{C}\left(p\right)=\left\{\begin{matrix}\begin{aligned} x\left(p\right)&=p \\ y\left(p\right)&=\sqrt{1-p^2} \end{aligned} \end{matrix} \right. \quad 0\le p \le 1 \tag{5} C(p)={x(p)y(p)=p=1p2 0p1(5)

1.1 曲线论初涉

1.1.1 曲线的参数变换

上文提到的 C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 表达的是同一个圆弧段,如果在各自的参数域内依次取点绘制图形,可以发现 C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 的圆弧是顺时针的。实际上我们可以将其进行方向的反转。只要做一个参数变换即可。可令 p = − q ∗ p=-q^* p=q ,对 C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 中的参数 p p p 进行替换,替换后结果为

C ( q ∗ ) = { x ( q ∗ ) = − q ∗ y ( q ∗ ) = 1 − ( q ∗ ) 2 − 1 ≤ q ∗ ≤ 0 (6) \mathbf{C}\left(q^*\right)=\left\{\begin{matrix}\begin{aligned} x\left(q^*\right)&=-q^* \\ y\left(q^*\right)&=\sqrt{1-\left(q^*\right)^2} \end{aligned}\end{matrix}\right. \quad -1\le q^* \le 0 \tag{6} C(q)= x(q)y(q)=q=1(q)2 1q0(6)

q ∗ q^* q 的参数域为负数,为更加方便处理,可再次进行参数变换,令 q = q ∗ + 1 q=q^*+1 q=q+1,则得到

C ( q ) = { x ( q ) = − ( q − 1 ) y ( q ) = 1 − ( q − 1 ) 2 0 ≤ q ≤ 1 (7) \color{purple}\mathbf{C}\left(q\right)=\left\{\begin{matrix}\begin{aligned} x\left(q\right)&=-\left(q-1\right) \\ y\left(q\right)&=\sqrt{1-\left(q-1\right)^2} \end{aligned} \end{matrix} \right. \quad 0\le q \le 1 \tag{7} C(q)= x(q)y(q)=(q1)=1(q1)2 0q1(7)

实际上可对 C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 直接做参数变换: p = 1 − q p=1-q p=1q,也能够得到 C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q)

1.1.2 曲线的一、二阶导矢

C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q)绘制在同一窗口,绘制时所有曲线均从各自参数域的 0.0 0.0 0.0 时刻出发, C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q) 在时刻 1.0 1.0 1.0 到达终点, C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) 在时刻 π / 2 \pi/2 π/2 到达终点。除了 C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 外,其他三条圆弧均沿逆时针方向走出了同样的路径。也能明显看到四条曲线路径形成过程中整体快慢、局部快慢都有所不同。我们接下来引入一点曲线论的内容,以进一步考察同一条几何曲线的不同表达存在什么可以量化的差异。
4种圆弧表达对比图
曲线采用单变量的矢函数表示,这个变量可以看作时间,各个坐标下的表达式即为该坐标下的运动刻画,从运动的分解与合成的角度即可对整体的运动有一些认识:

  1. 任一有效时刻,各分量均能计算出一个位置(零阶导);从整体看,矢函数刻画了物体随时间的空间位置的改变(结果为各分量位置的合成);
  2. 任一有效时刻,各分量均能计算出一个速度(一阶导);从整体看,矢函数的导数(结果仍为矢函数,是各分量导函数的合成)刻画了物体随时间的空间位置改变的程度,即速度(改变的方向和大小);
  3. 更进一步分析,还有二阶导表示的加速度。

实际上,上述分析是《微分几何》课程中曲线论的基本内容。我们暂按下不细表,仅初步体会矢函数一阶导矢(曲线切矢)、二阶导矢的物理含义。上述 C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q) 的一、二阶导矢为:

C ′ ( u ) = ( x ′ ( u ) , y ′ ( u ) ) T = ( − sin ⁡ ( u ) , cos ⁡ ( u ) ) T 0 ≤ u ≤ π 2 (8) \color{red}\mathbf{C}'\left(u\right)=\left(x'\left(u\right),y'\left(u\right)\right)^\mathrm{T}=\left(-\sin\left(u\right),\cos\left(u\right)\right)^\mathrm{T} \quad 0\le u\le\frac{\pi}{2} \tag{8} C(u)=(x(u),y(u))T=(sin(u),cos(u))T0u2π(8)

C ′ ′ ( u ) = ( x ′ ( u ) , y ′ ( u ) ) T = ( − cos ⁡ ( u ) , − sin ⁡ ( u ) ) T 0 ≤ u ≤ π 2 (9) \color{red}\mathbf{C}''\left(u\right)=\left(x'\left(u\right),y'\left(u\right)\right)^\mathrm{T}=\left(-\cos\left(u\right),-\sin\left(u\right)\right)^\mathrm{T} \quad 0\le u\le\frac{\pi}{2} \tag{9} C′′(u)=(x(u),y(u))T=(cos(u),sin(u))T0u2π(9)

C ′ ( t ) = ( x ′ ( t ) , y ′ ( t ) ) T = ( − 4 t ( 1 + t 2 ) 2 , 2 − 2 t 2 ( 1 + t 2 ) 2 ) T 0 ≤ t ≤ 1 (10) \color{green}\mathbf{C}'\left(t\right)=\left(x'\left(t\right),y'\left(t\right)\right)^\mathrm{T}=\left(\frac{-4t}{\left(1+t^2\right)^2},\frac{2-2t^2}{\left(1+t^2\right)^2}\right)^\mathrm{T} \quad 0\le t\le 1 \tag{10} C(t)=(x(t),y(t))T=((1+t2)24t,(1+t2)222t2)T0t1(10)

C ′ ′ ( t ) = ( x ′ ′ ( t ) , y ′ ′ ( t ) ) T = ( − 4 + 12 t 2 ( 1 + t 2 ) 3 , − 12 t + 4 t 3 ( 1 + t 2 ) 3 ) T 0 ≤ t ≤ 1 (11) \color{green}\mathbf{C}''\left(t\right)=\left(x''\left(t\right),y''\left(t\right)\right)^\mathrm{T}=\left(\frac{-4+12t^2}{\left(1+t^2\right)^3},\frac{-12t+4t^3}{\left(1+t^2\right)^3}\right)^\mathrm{T} \quad 0\le t\le 1 \tag{11} C′′(t)=(x′′(t),y′′(t))T=((1+t2)34+12t2,(1+t2)312t+4t3)T0t1(11)

C ′ ( p ) = ( x ′ ( p ) , y ′ ( p ) ) T = ( 1 , − p 1 − p 2 ) T 0 ≤ p ≤ 1 (12) \color{blue}\mathbf{C}'\left(p\right)=\left(x'\left(p\right),y'\left(p\right)\right)^\mathrm{T}=\left(1,\frac{-p}{\sqrt{1-p^2}}\right)^\mathrm{T} \quad 0\le p\le 1 \tag{12} C(p)=(x(p),y(p))T=(1,1p2 p)T0p1(12)

C ′ ′ ( p ) = ( x ′ ′ ( p ) , y ′ ′ ( p ) ) T = ( 0 , − 1 ( 1 − p 2 ) 3 / 2 ) T 0 ≤ p ≤ 1 (13) \color{blue}\mathbf{C}''\left(p\right)=\left(x''\left(p\right),y''\left(p\right)\right)^\mathrm{T}=\left(0,\frac{-1}{\left(1-p^2\right)^{3/2}} \right) ^\mathrm{T} \quad 0\le p\le 1 \tag{13} C′′(p)=(x′′(p),y′′(p))T=(0,(1p2)3/21)T0p1(13)

C ′ ( q ) = ( x ′ ( q ) , y ′ ( q ) ) T = ( − 1 , 1 − q 2 q − q 2 ) T 0 ≤ q ≤ 1 (14) \color{purple}\mathbf{C}'(q)=(x'(q),y'(q)) ^\mathrm{T}=\left(-1,\frac{1-q}{2q-q^2}\right) ^\mathrm{T} \quad 0\le q\le 1 \tag{14} C(q)=(x(q),y(q))T=(1,2qq21q)T0q1(14)

C ′ ′ ( q ) = ( x ′ ′ ( q ) , y ′ ′ ( q ) ) T = ( 0 , − 1 ( 2 q − q 2 ) 3 / 2 ) T 0 ≤ q ≤ 1 (15) \color{purple}\mathbf{C}''(q)=(x''(q),y''(q)) ^\mathrm{T}=\left(0,\frac{-1}{\left(2q-q^2\right)^{3/2}}\right) ^\mathrm{T} \quad 0\le q\le 1 \tag{15} C′′(q)=(x′′(q),y′′(q))T=(0,(2qq2)3/21)T0q1(15)

做出 C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q) 的曲线、导矢(黄色)和二阶导矢(紫色)的动态对比图。图中 C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q) 1.0 s 1.0s 1.0s 就到达了终点。另外可以看出:尽管表示了同一段圆弧,但这条同样的路径却有多种走法。我们可以想象有一辆车在1/4圆弧的道路上行驶,同一条路却开出了不同的方式。

四种表达方式的速度对比
实际上我们可以用切矢的模长来表示速率。
∣ C ′ ( u ) ∣ = sin ⁡ 2 ( u ) + cos ⁡ 2 ( u ) = 1 0 ≤ u ≤ π 2 (16) \color{red}|\mathbf{C}'\left(u\right)|=\sqrt{\sin^2\left(u\right)+\cos^2\left(u\right)}=1 \quad 0\le u\le\frac{\pi}{2} \tag{16} C(u)=sin2(u)+cos2(u) =10u2π(16)

∣ C ′ ( t ) ∣ = ( − 4 t ( 1 + t 2 ) 2 ) 2 + ( 2 − 2 t 2 ( 1 + t 2 ) 2 ) 2 = 2 1 + t 2 0 ≤ t ≤ 1 (17) \color{green}|\mathbf{C}'(t)|=\sqrt{\left(\frac{-4t}{(1+t^2)^2}\right)^2+\left(\frac{2-2t^2}{(1+t^2)^2}\right)^2}=\frac{2}{1+t^2} \quad 0\le t\le 1 \tag{17} C(t)=((1+t2)24t)2+((1+t2)222t2)2 =1+t220t1(17)

∣ C ′ ( p ) ∣ = 1 + p 2 1 − p 2 = 1 1 − p 2 0 ≤ p ≤ 1 (18) \color{blue}|\mathbf{C}'(p)|=\sqrt{1+\frac{p^2}{1-p^2}}=\frac{1}{\sqrt{1-p^2}} \quad 0\le p\le 1 \tag{18} C(p)=1+1p2p2 =1p2 10p1(18)

∣ C ′ ( q ) ∣ = 1 + ( 1 − q ) 2 ( 2 q − q 2 ) 2 = q 4 − 4 q 3 + 5 q 2 − 2 q + 1 2 q − q 2 0 ≤ q ≤ 1 (19) \color{purple}|\mathbf{C}'(q)|=\sqrt{1+\frac{\left(1-q\right)^2}{\left(2q-q^2\right)^2}}=\frac{\sqrt{q^4-4q^3+5q^2-2q+1}}{2q-q^2} \quad 0\le q\le 1 \tag{19} C(q)=1+(2qq2)2(1q)2 =2qq2q44q3+5q22q+1 0q1(19)

可以看出 C ( u ) \color{red}\mathbf{C}\left(u\right) C(u) 速率恒为 1.0 1.0 1.0; C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) 初始速率为 2.0 2.0 2.0 ,在终点处为 1.0 1.0 1.0; C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 初始速率为 1.0 1.0 1.0 ,在终点处增至 + ∞ +\infty + C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q) 初始速率为 + ∞ +\infty + ,在终点处减至 1.0 1.0 1.0

另一方面可以看出,对于同一段轨迹,可以用不同的速度配置走完。也就是说对于同一条空间曲线,我们可以有多种参数表达方式。但是曲线形状本身却固定不变。对于同样一条曲线,不同的速度配置意味着不同的参数化方式。实际上我们可以在不同的参数化形式间通过参数变换进行转化,一如上述 C ( p ) \color{blue}\mathbf{C}\left(p\right) C(p) 生成 C ( q ) \color{purple}\mathbf{C}\left(q\right) C(q)

1.1.3 曲线的弧长参数化

其实,对于同样一条空间曲线的众多参数化形式中,有一种最为特殊即弧长参数化,顾名思义,这种参数化表示即以弧长作为曲线的参数,我们可以想象汽车在一条固定的路径上以单位速度行进。下面以 C ( t ) \color{green}\mathbf{C}\left(t\right) C(t) 为例说明如何将一条普通的参数化曲线做弧长参数化。

根据弧长公式有:

σ = ∫ 0 t ∣ C ′ ( t ) ∣ d t = ∫ 0 t 2 1 + t 2 d t = 2 arctan ⁡ t 0 ≤ t ≤ 1 (20) \color{green}\sigma=\int_{0}^{t}|\mathbf{C}'\left(t\right)|dt=\int_{0}^{t}\frac{2}{1+t^2}dt=2\arctan{t}\quad 0\le t\le 1 \tag{20} σ=0tC(t)dt=0t1+t22dt=2arctant0t1(20)

那么可以根据 t = tan ⁡ σ 2 , 0 ≤ σ ≤ π 2 t=\tan{\frac{\sigma}{2}},0\le\sigma\le\frac{\pi}{2} t=tan2σ,0σ2π C ( t ) \color{green}\mathbf{C}(t) C(t) 作参数变换,即有

C ( σ ) = { x ( σ ) = 1 − ( tan ⁡ σ 2 ) 2 1 + ( tan ⁡ σ 2 ) 2 = ( cos ⁡ π 2 ) 2 − ( sin ⁡ π 2 ) 2 = cos ⁡ σ y ( σ ) = 2 tan ⁡ σ 2 1 + ( tan ⁡ σ 2 ) 2 = 2 sin ⁡ σ 2 cos ⁡ σ 2 = sin ⁡ σ 0 ≤ σ ≤ π 2 (21) \color{green}\mathbf{C}\left(\sigma\right)=\left\{\begin{matrix}\begin{aligned} x\left(\sigma\right)&=\frac{1-(\tan{\frac{\sigma}{2}})^2}{1+(\tan{\frac{\sigma}{2}})^2} =(\cos{\frac{\pi}{2}})^2-(\sin{\frac{\pi}{2}})^2=\cos{\sigma} \\ y\left(\sigma\right)&=\frac{2\tan{\frac{\sigma}{2}}}{1+(\tan{\frac{\sigma}{2}})^2}=2\sin{\frac{\sigma}{2}}\cos{\frac{\sigma}{2}}=\sin{\sigma} \end{aligned}\end{matrix}\right. \quad 0\le\sigma\le\frac{\pi}{2} \tag{21} C(σ)= x(σ)y(σ)=1+(tan2σ)21(tan2σ)2=(cos2π)2(sin2π)2=cosσ=1+(tan2σ)22tan2σ=2sin2σcos2σ=sinσ0σ2π(21)

一番操作,我们竟得到了 C ( u ) \color{red}\mathbf{C}(u) C(u) 。实际上从上述对速率的分析中也能看出, C ( u ) \color{red}\mathbf{C}(u) C(u) 的速率恒为 1.0 1.0 1.0 ,就是“以恒定的速率行进”了。但并不是说任给一条曲线我们都能得到其弧长参数形式,上述转换中我们有幸能够表示出弧长与原有参数关系的反函数的解析形式(即 t = tan ⁡ σ 2 , 0 ≤ σ ≤ π 2 t=\tan{\frac{\sigma}{2}},0\le\sigma\le\frac{\pi}{2} t=tan2σ,0σ2π),更多情况下这种关系并不能被直接表达出来。

弧长参数化的意义更多体现在理论推导上,相当于我们找到了一组同轨迹曲线的“基本形式”,这个“基本形式”摒除掉曲线的各种参数化表示的特异的性质,抓住主要矛盾,直指曲线本身。在弧长参数表达的基础上,我们能够推导出曲线更多的性质,这些都体现为《微分几何》课程“曲线论”部分的内容。

1.2 曲面论初涉

S ( u , v ) \mathbf{S}\left(u,v\right) S(u,v) 表示球心在原点处,半径为 1.0 1.0 1.0 的球。下图动态展示了灰色参数域 0 ≤ u ≤ π , 0 ≤ v ≤ 2 π 0\le u\le \pi,0\le v\le 2\pi 0uπ,0v2π 到空间域的映射。注意下面这个动图虽然把参数域和空间曲面画在了一起,但其实分属不同的坐标系。从 S ( u , v ) \mathbf{S}\left(u,v\right) S(u,v) 公式本身也能找到另一种直观的几何意义。存在单位矢量其与 z z z 轴正向的夹角为 u u u,则其投影到 z z z轴的值为 c o s ( u ) cos(u) cos(u),其投影到 x O y xOy xOy平面的的投影矢量长度为 s i n ( u ) sin(u) sin(u) ,该投影矢量与 x x x轴的正向夹角为 v v v,则该矢量进一步向 x x x 轴和 y y y 轴投影,分别得到坐标 s i n ( u ) c o s ( v ) sin(u)cos(v) sin(u)cos(v) s i n ( u ) s i n ( v ) sin(u)sin(v) sin(u)sin(v)

球面映射图

1.2.1 曲面上的曲线

我们就以此球面为例,来初步了解一些曲面论的内容。这里需要回到朴素的“点动成线,线动成点”的思想,为了研究曲面,我们需要在曲面上构造一些曲线,以方便使用曲线的一些结论。实际上,《微分几何》里也是这么做的,通过构造“曲面上的曲线”来考察曲面的性质。顾名思义,“曲面上的曲线”即一条位于曲面上的曲线,但是面上的线有无数条,我们该选取哪一条呢?先取一条一般的曲线试试看。

诚然,球面上总会有一些特殊的曲线可待选取。为不失一般性,我们暂时不考虑那些你脑海中已经有的球面上的诸多简单的圆,或者那些足够复杂,但是你却写不出其表达式的曲线。

曲面的参数域是一个平面域,在平面域内,我们可以找到很多参数曲线,然后将此参数曲线映射到球面上,就能够得到一个球面上的曲线了。这里我给提供了一个构造出的例子:在参数域 0 ≤ u ≤ π , 0 ≤ v ≤ 2 π 0\le u\le \pi,0\le v\le 2\pi 0uπ,0v2π 上有一根曲线,它的定义式和一阶导如下。

C ( t ) = { u ( t ) = 16 t 4 − 22 t 3 + t 2 + 5 t + 1 v ( t ) = 64 t 4 − 126 t 3 + 61 t 2 + t + 1 0 ≤ t ≤ 1 (22) \mathbf{C}\left(t\right)=\left\{\begin{matrix}\begin{aligned} u\left(t\right)&=16t^4-22t^3+t^2+5t+1 \\ v\left(t\right)&=64t^4-126t^3+61t^2+t+1 \end{aligned} \end{matrix} \right. \quad 0\le t \le 1 \tag{22} C(t)={u(t)v(t)=16t422t3+t2+5t+1=64t4126t3+61t2+t+10t1(22)

C ′ ( t ) = { u ′ ( t ) = 64 t 3 − 66 t 2 + 2 t + 5 v ′ ( t ) = 256 t 3 − 378 t 2 + 122 t + 1 0 ≤ t ≤ 1 (23) \mathbf{C}'\left(t\right)=\left\{\begin{matrix}\begin{aligned} u'\left(t\right)&=64t^3-66t^2+2t+5 \\ v'\left(t\right)&=256t^3-378t^2+122t+1 \end{aligned} \end{matrix} \right. \quad 0\le t \le 1 \tag{23} C(t)={u(t)v(t)=64t366t2+2t+5=256t3378t2+122t+10t1(23)

这个式子看起来很复杂,但其实它满了下面的结果,并且其在整个定义域 0 ≤ t ≤ 1 0\le t\le 1 0t1 内,结果均分布在 0 ≤ u ≤ π , 0 ≤ v ≤ 2 π 0\le u\le \pi,0\le v\le 2\pi 0uπ,0v2π 上。

C ( 0 ) = C ( 1 ) = ( 1 1 ) T (24) \mathbf{C}\left(0\right)=\mathbf{C}\left(1\right)=\begin{pmatrix} 1 & 1 \end{pmatrix}^{T} \tag{24} C(0)=C(1)=(11)T(24)

C ′ ( 0 ) = C ′ ( 1 ) = ( 5 1 ) T (25) \mathbf{C}'\left(0\right)=\mathbf{C}'\left(1\right)=\begin{pmatrix} 5 & 1 \end{pmatrix}^{T} \tag{25} C(0)=C(1)=(51)T(25)

上述结果表明,这是一条首尾封闭,并且在首尾处切矢还连续的曲线,它能够描述一个 u v uv uv 域上的封闭区域。将该曲线与 S ( u , v ) \mathbf{S}(u,v) S(u,v) 写成复合形式,则有

S ( t ) = S ( u ( t ) , v ( t ) ) (26) \mathbf{S}(t)=\mathbf{S}\left(u(t),v(t)\right) \tag{26} S(t)=S(u(t),v(t))(26)

这就是一条曲面上的曲线,其在球面上的映射结果如下图所示。它在球面上也是一条封闭的曲线,其圈定出了球面上的一片区域,或者我们说它从球面上“裁剪”了一块区域。值得一提的是,CAD模型中的曲面多以这种“基本的曲面+边界”的形式来表达一块类似裁剪的效果,这就是常说的裁剪曲面。若干裁剪曲面通过进一步组织其相邻关系,从而表示了一个水密的实体,这就是所谓的边界表示法(B-Rep)。CAD中的裁剪曲面的边界一般不会通过上例这样,人为指定一个封闭的参数域曲线而生成,而是通过投影、相交等更为复杂的算法求得的。比如我们这个球面的例子,形似头盔,假设圈定的曲面部分就是眼罩。在某款CAD软件中要设计这样的头盔,我们会先生成一个球面,然后编辑一个空间的曲线,再将该曲线投影到球面上来,从而获取一个球面上的要被挖空的曲面边界,后续再有抽壳、圆角等细化操作。这样的操作流程更符合几何直观,方便设计人员交互设计。但我们可以思考:投影曲线应该怎么表示?我们能获取到投影线的精准的参数表示吗?一个事实是:复杂曲面(这里所谓复杂即所用的曲面并不全都是平面、二次曲面等)设计过程中的投影线、交线、等距线等几何对象都很难获取到精准的参数表示,其在几何内核中多以离散、拟合、过程的表达方式存储,但要符合造型容差的要求。

球面上的曲线

1.2.2 曲面上曲线的切矢与曲面的法矢

回到我们的例子。参数 t t t [ 0 , 1 ] [0,1] [0,1] 定义域上变化,从而求出某一时刻的 u ( t ) , v ( t ) u(t),v(t) u(t),v(t),更进一步地,可以求出球面上的某个点。我们可以试着利用复合函数的求导法则求出曲线 S ( t ) = S ( u ( t ) , v ( t ) ) \mathbf{S}(t)=\mathbf{S}\left(u(t),v(t)\right) S(t)=S(u(t),v(t)) 的导矢。

S ′ ( t ) = S ′ ( u ( t ) , v ( t ) ) = S u d u d t + S v d v d t (27) \mathbf{S}'(t)=\mathbf{S}'\left(u(t),v(t)\right)=\mathbf{S}_u\frac{du}{dt}+\mathbf{S}_v\frac{dv}{dt} \tag{27} S(t)=S(u(t),v(t))=Sudtdu+Svdtdv(27)

其中
S u = ( x u ( u , v ) , y u ( u , v ) , z u ( u , v ) ) T = ( c o s ( u ) c o s ( v ) , c o s ( u ) s i n ( v ) , − s i n ( u ) ) T (28) \mathbf{S}_u=(x_u(u,v),y_u(u,v),z_u(u,v))^T=(cos(u)cos(v),cos(u)sin(v),-sin(u))^T \tag{28} Su=(xu(u,v),yu(u,v),zu(u,v))T=(cos(u)cos(v),cos(u)sin(v),sin(u))T(28)

∣ S u ∣ = 1 (29) |\mathbf{S}_u|=1 \tag{29} Su=1(29)

S v = ( x v ( u , v ) , y v ( u , v ) , z v ( u , v ) ) T = ( − s i n ( u ) s i n ( v ) , s i n ( u ) c o s ( v ) , 0 ) T (30) \mathbf{S}_v=(x_v(u,v),y_v(u,v),z_v(u,v))^T=(-sin(u)sin(v),sin(u)cos(v),0)^T \tag{30} Sv=(xv(u,v),yv(u,v),zv(u,v))T=(sin(u)sin(v),sin(u)cos(v),0)T(30)

∣ S v ∣ = ∣ s i n ( u ) ∣ (31) |\mathbf{S}_v|=|sin(u)| \tag{31} Sv=sin(u)(31)

从公式 ( 27 ) (27) (27) 可以看出,对于某一时刻的 S ′ ( t ) \mathbf{S}'(t) S(t) ,可以看成是向量 S u \mathbf{S}_u Su S v \mathbf{S}_v Sv 的复合,其在 S u \mathbf{S}_u Su S v \mathbf{S}_v Sv 张成的平面上。另一方面,我们可以定义曲面上某点的单位法矢

N ( t ) = S u × S v ∣ S u × S v ∣ (32) \mathbf{N}(t)=\frac{\mathbf{S}_u\times\mathbf{S}_v}{|\mathbf{S}_u\times\mathbf{S}_v|} \tag{32} N(t)=Su×SvSu×Sv(32)

对于曲面上某点而言,穿过该点的曲面上曲线有无数条,也就是会有任意的 d u d t \frac{du}{dt} dtdu d v d t \frac{dv}{dt} dtdv 组合出各个方向、各种长度的 S ′ ( t ) \mathbf{S}'(t) S(t) ,但是这些 S ′ ( t ) \mathbf{S}'(t) S(t) 都将分布在 S u \mathbf{S}_u Su S u \mathbf{S}_u Su 张成的平面上,且均与 N \mathbf{N} N 垂直。

给出的示意图中蓝色矢量为 S u \mathbf{S}_u Su S v \mathbf{S}_v Sv ;红色矢量为 N \mathbf{N} N ;绿色矢量为 S ′ ( t ) \mathbf{S}'(t) S(t) 。子图“沿法矢观察视角”视角始终平行于法矢 N \mathbf{N} N ,可以看出 S ′ ( t ) \mathbf{S}'(t) S(t) 始终与曲线相切,并始终位于 S u \mathbf{S}_u Su S v \mathbf{S}_v Sv 张成的平面中。再观察子图“各矢量模长”,可以发现, S ( t ) \mathbf{S}(t) S(t) 的速度快慢有变, S u \mathbf{S}_u Su 模长始终为 1.0 1.0 1.0 S v \mathbf{S}_v Sv 只与 s i n ( u ) sin(u) sin(u) 有关,因为我们的 u u u 均取在 π / 2 \pi/2 π/2 附近,所以其长度也在 1.0 1.0 1.0 附近波动。

类比曲线,我们再思考曲面上的一个问题:任意一个曲面,其参数表达形式也是多样的,是否有类似于曲线弧长参数化那种方式,对曲面能够做一些处理,以获得一些曲面上的性质呢?比如说想象任意一张曲面,尽管我们不知道它的具体表达式,但是曲面某处弯曲变化的强弱是固定的,这个性质能否量化求出呢?事实上,对于曲面的性质的研究还是需要借助上文提到的“曲面上的曲线”这一工具,利用曲线的一些性质来推导出曲面的性质。比如量化曲面在某点处弯曲变化的强弱,在曲线里弯曲变化的强弱可以借助“曲率”这一概念计算(在《微分几何》中也会提到,做弧长参数化后可以很容易推导出曲率的表达式),而当我们使用通过曲面上某点的“曲面上的曲线”来考察曲面上某点的曲率时,首先就会遇到一个问题:通过该点的曲线太多了,正如上文提到的:任意的 d u d t \frac{du}{dt} dtdu d v d t \frac{dv}{dt} dtdv 都能够组合出一种过该点的曲线的瞬时变化情况。为解决这一问题,我们可以统计出所有的过该点的曲线的曲率情况,然后找出几个“曲率”的统计量,比如最大值、最小值等等。后面我们会专门对曲线论、曲面论的内容做总结。

2. 曲线和曲面的隐式表示

隐式表示即给出各个坐标分量所满足的方程。如下两个方程,分别表示了半径为1的整圆和球面。

x 2 + y 2 = 1 (33) x^2+y^2=1 \tag{33} x2+y2=1(33)

x 2 + y 2 + z 2 = 1 (34) x^2+y^2+z^2=1 \tag{34} x2+y2+z2=1(34)

这些表达形式我们在解析几何里都已经接触过。具体的性质不再赘述了,网上也有很多介绍其他的隐式表示曲线、曲面的材料。

给定某点 P ( 1 2 , 3 2 ) \mathbf{P}(\frac{1}{2},\frac{\sqrt{3}}{2}) P(21,23 ) ,我们要判断 P \mathbf{P} P 是否在圆弧上。如果使用参数形式,我们就不得不进行方程的求解。如果使用隐式形式,只需计算待求点是否满足方程即可。另外对于封闭的曲线,使用隐式表示还非常容易计算某点是否在曲线内。比如从 2 2 + 3 2 > 1 2^2+3^2>1 22+32>1 可知,点 ( 2 , 3 ) (2,3) (2,3) 在曲线外。同样是封闭曲线,使用公式 ( 9 ) (9) (9) 的参数表示就难以判断点与曲线的内外关系,读者可以考虑怎么计算点 ( 1 , 2 ) (1,2) (1,2)是否在公式 ( 9 ) (9) (9) 表达的封闭曲线内部。

另一方面,如果要将曲线离散成点串,隐式表示就显得比较困难。比如对于圆 x 2 + y 2 = 1 x^2+y^2=1 x2+y2=1 ,每确定出一个 x x x ,均需进行方程求解(多为非线性方程)从而获得 y y y 值,非线性方程稳准快地求解本身就是一个难题。

可以看出,显示和隐式表示各有利弊。一般来讲,在一个CAD系统内,对于直线、二次曲线、平面、二次曲面,我们倾向于两种方式都用到,因为对于这些几何对象,这两种表达方式的转换很方便,这样就可以兼取两种表达的长处。对于后续要讲到的Bezier、B样条、NURBS曲线/面,我们就只有参数表达形式了。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: ACIS-CAD编程类库是一种用于开发CAD软件的编程库。ACIS是几何建模内核,可以提供丰富的几何操作和分析功能,包括创建、编辑和查询几何实体,如点、线、面和立体等。而CAD编程类库则是基于ACIS内核的一组软件工具和功能,用于帮助开发者实现CAD软件的自定义和扩展。 ACIS-CAD编程类库可以在开发过程提供很多优势。首先,它提供了底层的几何处理功能,使得开发者可以轻松地进行几何操作和计算,如形状的移动、旋转、缩放和截取等。其次,ACIS-CAD编程类库还支持各种文件格式的导入和导出,例如DWG和STEP等,使得开发者可以方便地与其他CAD软件交互。此外,ACIS-CAD编程类库还提供了强大的三维可视化功能,可以实现高质量的渲染和显示,使得开发的CAD软件具有更好的用户体验。 使用ACIS-CAD编程类库可以实现各种各样的功能和扩展。例如,可以开发自定义的CAD工具和命令,用于快速创建和编辑几何实体。还可以实现各种算法,如碰撞检测、包围盒计算和曲面拟合等。此外,ACIS-CAD编程类库还可以用于开发CAD软件的插件和扩展,为用户提供更多的选择和功能。 综上所述,ACIS-CAD编程类库是一种强大的软件工具,可以帮助开发者快速而方便地创建、编辑和分析CAD软件的几何实体。它的灵活性和可扩展性使得开发者可以实现各种定制化的功能和扩展,为用户提供更好的使用体验。 ### 回答2: ACIS-CAD编程类库是一种用于CAD软件开发的工具包。ACIS(三维CAD部分)是一个由Dassault Systemes公司开发的CAD内核,是许多主流CAD软件使用的核心技术。编程类库则是基于ACIS内核开发的一组API(应用程序接口),提供了丰富的CAD编程功能和工具,方便开发者通过编程来定制和扩展CAD软件的功能。 ACIS-CAD编程类库可以帮助开发者实现多种CAD相关功能,如模型创建和编辑、几何操作、实体选择、边界计算、坐标变换等。开发者可以使用ACIS-CAD编程类库的API进行二次开发,定制CAD软件的功能和界面,满足特定的设计需求。同时,ACIS-CAD编程类库还提供了丰富的CAD数据交换功能,可以实现与其他CAD软件和数据格式的互操作性。 ACIS-CAD编程类库使用简单灵活,具有较高的性能和稳定性。通过使用该编程类库,开发者可以大大提高CAD软件的开发效率和功能扩展性。同时,ACIS-CAD编程类库还提供了丰富的文档和示例代码,帮助开发者快速入门和理解API的使用方法。 综上所述,ACIS-CAD编程类库是一种强大的CAD软件开发工具包,提供了丰富的API和功能,帮助开发者定制和扩展CAD软件的功能,提高开发效率和软件质量。使用该编程类库,开发者可以满足各种CAD软件开发需求,使其更加适应个性化的设计需求。 ### 回答3: ACIS-CAD编程类库是一种用于开发计算机辅助设计(CAD)软件的程序库。ACIS是Automated CONstrain-based Incremental Solver的缩写,意为自动基于约束的增量求解器。它是由Spatial Corporation开发的一套先进的三维几何建模和分析工具。 ACIS-CAD编程类库提供了一系列功能强大的API(应用程序接口),可以用于创建、编辑和分析三维几何模型。它支持多种CAD文件格式,并提供了高级的几何操作和分析功能,如布尔运算、曲线曲面操作、造型和变换、碰撞检测等。 使用ACIS-CAD编程类库,开发人员可以轻松实现各种CAD软件的功能,包括绘图、构建模型、进行参数化设计、进行仿真和分析等。它还支持多线程编程,可以有效提高开发效率和运行速度。 ACIS-CAD编程类库具有良好的跨平台性能,可以在Windows、Linux和Mac等多个操作系统上运行。它还与其他常用的CAD软件和工具集成,如AutoCAD、SolidWorks、CATIA等。在CAD行业被广泛应用,并得到了许多CAD软件开发公司和设计团队的青睐。 总之,ACIS-CAD编程类库是一种强大的软件开发工具,可用于构建CAD应用程序和开发各种CAD相关的功能。它的功能丰富、易用性强,并具有良好的跨平台性能,是CAD领域不可或缺的重要组成部分。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值