Chapter 15 Curves

(个人笔记,由于刚开始学习再加上英语不太好,所以有的地理解的可能不太对,望指正)

Chapter 15 Curves

15.1 Curves

数学上来讲,曲线可以使用两种方式进行定义:

  1. 在一个n维空间上的一个连续图像
  2. 一个从一维空间到n微空间的一个连续映射

一个普通的形状的曲线没有一个命名形状,它被称为free-form曲线。

表示曲线的方式:

  1. Implicit: f ( x , y ) = 0 f(x, y) = 0 f(x,y)=0
  2. Parametric: ( x , y ) = f ( t ) (x, y) = f(t) (x,y)=f(t)
  3. Generative or procedural: 通过表示曲线生成的过程并且不属于之前两种曲线形式的方式。

15.1.1 Parameterizations and Reparameterizations

如果定义一个函数 f ( t ) f(t) f(t)表示了区间 [ a , b ] [a,b] [a,b]上的一段曲线,可以使用一个新的函数 f 2 ( u ) f_2(u) f2(u)来将它表示到一个单位区间上:

g ( u ) = a + ( b − a ) u f 2 ( u ) = f ( g ( u ) ) g(u) = a + (b - a)u \\ f_2(u) = f(g(u)) g(u)=a+(ba)uf2(u)=f(g(u))

f 和 f 2 f和f_2 ff2表示了相同的曲线,但是他们是不同的表示形式,使用一个新的参数来表示曲线的过程称为reparameterization。

如果曲线的切线的大小是恒定的,那么这种参数化就认为是一个arc-length参数化,通常使用s来表示arc-length参数:

∣ d f ( s ) d s ∣ 2 = c \begin{vmatrix} \frac{df(s)}{ds} \end{vmatrix}^2 = c dsdf(s)2=c

计算曲线的长度可以计算导数大小的积分:

s = ∫ 0 v ∣ d f ( t ) d t ∣ 2 d t s = \int_0^v \begin{vmatrix} \frac{df(t)}{dt} \end{vmatrix}^2 dt s=0vdtdf(t)2dt

15.1.2 Piecewise Parametric Representations

在这里插入图片描述

为了简化曲线的表达方式,可以将虚线分成多段,每一段是一个简单地形式,图中a,b都可以表示为。

f ( u ) = { f 1 ( 2 u ) , u ≤ 0.5 , f 2 ( 2 u − 1 ) , u > 0.5      ( 公 式 1 ) f(u)=\begin{cases} f_1(2u), u \le 0.5,\\ f_2(2u - 1) , u \gt 0.5 \end{cases} \ \ \ \ (公式1) f(u)={f1(2u),u0.5,f2(2u1),u>0.5    (1)

其中 f 1 和 f 2 f_1和f_2 f1f2都是定义在单位区间上的函数,需要确保 f 1 ( 1 ) = f 2 ( 0 ) f_1(1)=f_2(0) f1(1)=f2(0)

上图中c是将圆弧分成多个线段表示,是否使用这种方式需要多个权衡:

  1. 近似表达式与原表达式的相似程度
  2. 每一部分的复杂程度
  3. 需要使用多少部分

15.1.3 Splines

15.2 Curve Properties

属性的类型分为:local property和global property。对于local property的研究称为微分几何,包括:

∙ \bullet 连续性(continuity)
∙ \bullet 曲线上的位置
∙ \bullet 曲线上的方向
∙ \bullet 曲率 (curvature)(曲率的描述见:https://www.zhihu.com/question/25952605 )

如果某点是曲线上的一部分,那么称该曲线插入(interplate)该点。

15.2.1 Continuity

如果曲线是通过公式1来定义的,那么需要特别处理两部分的连接处,如果 f 1 ( 1 ) ≠ f 2 ( 0 ) f_1(1)\not ={f_2(0)} f1(1)=f2(0),那么该曲线是断开的,从本章对于曲线的定义来说,断开的曲线不能称为曲线。除了检测顶点的位置,还需要检测两部分的导数是否匹配,如果 f 1 ′ ( 1 ) ≠ f 2 ′ ( 0 ) f_1^{'}(1) \not ={f_2^{'}(0)} f1(1)=f2(0),那么连接点处会有一个突然地转变,那么一阶导数在该点不连续。

之前描述的曲线的连续性称为参数连续性(parametric continuity)因为它依赖于两条曲线的参数化,如果两条曲线的“速度”不同,那么认为是不连续的。如果需要关注曲线的形状,那么需要引入几何连续性(geometric continuity),直观上它表示每一部分必须有相同的导数方向,即使大小不同。

表示为:
C 1 连 续 性 : f 1 ′ ( 1 ) = f 2 ′ ( 0 ) G 1 连 续 性 : f 1 ′ ( 1 ) = k f 2 ′ ( 0 ) C^1连续性:f_1^{'}(1)=f_2^{'}(0) \\ G^1连续性:f_1^{'}(1)=kf_2^{'}(0) C1f1(1)=f2(0)G1f1(1)=kf2(0)

因此几何连续性的限制比参数连续性的要低。

15.3 Polynomial Pieces

在计算机图形学中最常使用的曲线表示是利用基本元素组成的多项式表示的:

f ( t ) = a 0 + a 1 t + a 2 t 2 + . . . + a n t n f(t)=a_0 + a_1t + a_2t^2 + ... + a_nt^n f(t)=a0+a1t+a2t2+...+antn

其中 a i a_i ai称为系数, n n n称为多项式的度(degree)如果 a n ≠ 0 a_n \not ={0} an=0,也可以表示为:

f ( t ) = ∑ i = 0 n a i t i      ( 公 式 2 ) f(t) = \sum_{i=0}^{n}a_it^i \ \ \ \ (公式2) f(t)=i=0naiti    (2)

该表达式称为多项式的标准形式,它可以继续归纳为:

f ( t ) = ∑ i = 0 n c i b i ( t ) f(t) = \sum_{i=0}^{n}c_ib_i(t) f(t)=i=0ncibi(t)

其中 b i ( t ) b_i(t) bi(t)表示一个多项式,对于标准形式 b i ( t ) = t i b_i(t)=t^i bi(t)=ti

15.3.2 A Line Segment

一条从 p 0 到 p 1 p_0到p_1 p0p1的线段,可以表示为单位区间上的参数形式:

f ( u ) = ( 1 − u ) p 0 + u p 1 f(u)=(1-u)p_0+up_1 f(u)=(1u)p0+up1

如果定义一个向量u:

u = [ 1   u   u 2   . . . u n ] u = [1\ u\ u^2\ ... u^n] u=[1 u u2 ...un]

所以公式2可以表示为

f ( u ) = u ∙ a      ( 公 式 3 ) f(u) = u \bullet a \ \ \ \ (公式3) f(u)=ua    (3)

如果需要使用两个顶点来表示,那么可以使用:

p 0 = f ( 0 ) = [ 1   0 ] ∙ [ a 0   a 1 ] p 1 = f ( 1 ) = [ 1   1 ] ∙ [ a 0   a 1 ] p_0 = f(0) = [1\ 0]\bullet[a_0\ a_1] \\ p_1 = f(1) = [1\ 1]\bullet[a_0\ a_1] p0=f(0)=[1 0][a0 a1]p1=f(1)=[1 1][a0 a1]

Matrix Form for Polynomials

p = C a p = Ca p=Ca

其中C是约束矩阵(constraint matrix:https://www.kbp.media/constraints-matrix/)。令 B = C − 1 B=C^{-1} B=C1,则公式3可以表示为

f ( u ) = u B p f(u)=uBp f(u)=uBp

15.3.3 Beyond Line Segments

公式2的优点之一是如果应用到更复杂的表达式时,只需要将n设置为一个更大的值。还有另一种比较方便的约束,曲线在某点处的导数,直观上来说一阶导数描述曲线曲线方向,二阶导数描述方向转变的速度。

15.3.4 Basis Matrics for Cubics

15.3.5 Blending Functions

将一个参数向量 u u u与矩阵B相乘可以得到一个向量:

b ( u ) = u B b(u)=uB b(u)=uB

b ( u ) b(u) b(u)的值依赖于自由参数 u u u,我们将 b ( u ) b(u) b(u)称为混合函数,可以使用它来将控制点向量混合:

f ( u ) = ∑ i = 0 n b i ( u ) p i f(u) = \sum_{i=0}^{n}b_i(u)p_i f(u)=i=0nbi(u)pi

该函数将控制点线性混合(也称为加权平均),对于任意维度的 b i b_i bi函数来说都是这样。

15.3.6 Interpolating Polynomials

一般来说一个n维多项式可以对n+1个值的集合进行插值。对于一个给定的顶点向量 p = ( p 0 , . . . , p n ) p = (p_0,...,p_n) p=(p0,...,pn)来进行插值和一个参数向量 t = ( t 0 , . . . , t n ) , t i ≠ t j t=(t_0,...,t_n),t_i\neq t_j t=(t0,...,tn),ti=tj,我们可以生成一个 ( n + 1 ) ∗ ( n + 1 ) (n + 1) * (n + 1) (n+1)(n+1)维的矩阵B,从而得到一个函数 f ( t ) f(t) f(t),它满足 f ( t i ) = p i f(t_i) = p_i f(ti)=pi。对于任意向量t,都需要生成并求解一个 1 ∗ ( n + 1 ) 1 * (n + 1) 1(n+1)的线性表达式,这提供我们一系列n+1维基础函数来表示插值:

f ( t ) = ∑ i = 0 n p i b i ( t ) f(t) = \sum_{i = 0}^{n}p_ib_i(t) f(t)=i=0npibi(t)

一种计算基础函数 b i b_i bi的方法是:

b i = ∏ j = 0 , j ≠ i n x − t j t i − t j b_i = \prod_{j = 0, j\neq i}^{n}\frac{x - t_j}{t_i - t_j} bi=j=0,j=intitjxtj

插值多项式提供了一种通过插值一系列点来定义曲线的方式。

15.4 Putting Pieces Together

15.4.1 Knots

对于分段函数中的每一个多项式,在它开始和结束的位置有一个site,一段函数开始和结束的site称为knots。

可以将分段函数通过系数合成一个基础函数和的形式的多项式。

15.4.2 Using Independent Pieces

15.4.3 Putting Segments Together

如果需要连接两个线段,需要确保第一条线段的结束位置跟第二条线段的开始是相同的。有三种方式可以连接两条线段:

  1. 使用两个顶点表示一条线段,两条线段共享一个顶点,这种方式称为shared-point。
  2. 每当第一条线段更新时,将第一条线段的结束位置拷贝到第二条线段的开始位置,这种方式称为dependency。
  3. 写出连接的明确表达式,当其他的参数改变时通过多种方法增强它(什么玩意?)

使用不同的连接方式要注意locality问题。

在这里插入图片描述

15.5 Cubics

当使用分段多项式表示曲线时,通常可以使用线段或者三次多项式。使用三次多项式的原因有:

  1. 分段三次多项式保证了 C 2 C^2 C2的连续性。
  2. 三次多项式保证了一系列点的最小曲率插值。如果有n+3个点需要定义一条最平滑的曲线经过它们(也就是曲线有最小的曲率),那么这条曲线可以被表示为n段的分段三次曲线。
  3. 三次多项式拥有良好的对称性,可以在开始和结束指定位置和导数(位置是什么鬼)
  4. 三次多项式可以在计算量和平滑性之间很好地权衡。

三次多项式的基本形式为:

f ( u ) = a 0 + a 1 u + a 2 u 2 + a 3 u 3 f(u)=a_0+a_1u+a_2u^2+a_3u^3 f(u)=a0+a1u+a2u2+a3u3

分段曲线的四个期望属性:

  1. 每一段都是一个三次多项式
  2. 曲线内插控制点
  3. 曲线具有local control
  4. 曲线 C 2 C^2 C2连续

一个表示方法最多同时满足三个属性。

15.5.1 Natural Cubics

https://www.cnblogs.com/xpvincent/archive/2013/01/26/2878092.html

C 2 C^2 C2连续三次链被称为natural cubic spline,它不具有locality性质。

15.5.2 Hermite Cubics

Hermite Cubics指定顶点的位置和一阶导数,线段可以连接成 C 1 C^1 C1 spline。给定n个控制点,可以包含 ( n − 2 ) / 2 (n-2)/2 (n2)/2个三次片段。

在这里插入图片描述

它具有local control。

15.5.3 Cardinal Cubics

Cardinal cubics spline是一个满足 C 1 C^1 C1并满足内插控制点的三次多项式片段。给定n个控制点,它使用n-2个三次多项式片段内插所有控制点。

Cardinal cubics spline包含一个称为tension的参数用来控制点之间曲线的拉紧程度,它的取值范围是 [ 0 , 1 ) [0,1) [0,1)

每一段使用四个控制点,相邻的两个片段共享三个控制点,片段的开始点为第二个,结束点为第三个,开始点的导数由一三两点的连线决定,结束点的导数由二四两点的连线决定。

在这里插入图片描述

tension参数用来调整导数的缩放程度:

f ( 0 ) = p 2 f ( 1 ) = p 3 f ′ ( 0 ) = 1 2 ( 1 − t ) ( p 3 − p 1 ) f ′ ( 1 ) = 1 2 ( 1 − t ) ( p 4 − p 2 ) f(0)=p_2 \\ f(1)=p_3 \\ f'(0)=\frac{1}{2}(1-t)(p_3-p_1) \\ f'(1)=\frac{1}{2}(1-t)(p_4-p_2) \\ f(0)=p2f(1)=p3f(0)=21(1t)(p3p1)f(1)=21(1t)(p4p2)

Cardinal cubics spline提供一种简便的方法根据控制点来创建 C 1 C^1 C1连续的曲线,但是它不连接第一个和最后一个控制点。

插值多项式相比于Cardinal cubics spline来说具有的缺点是:

  1. 插值多项式会超出控制点
  2. 对插值多项式的计算和控制都不是local的。

15.6 Approximating Curves

图形学中两个最重要的近似曲线类型是Bezier曲线和B-spline曲线。

15.6.1 Bezier Curves

d维度的Bezier曲线由d+1个控制点控制生成,曲线通过第一个和最合一个控制点插值生成,并由其他点控制形状。在图形学中通常使用多个3维度的Bezier曲线连接形成复杂的曲线。

创建一个Bezier曲线的过程:

  1. 曲线内插第一个和最后一个控制点
  2. 第一个和最后一个控制点位置的一阶导数是由第一个和第二个控制点的向量决定的,导数的值是由向量与曲线的维度相乘得到
  3. 高阶导数是由开始的多个顶点决定的

在这里插入图片描述

Bernstein basis polynomials:

b k , n ( u ) = C ( n , k ) u k ( 1 − u ) n − k b_{k,n}(u)=C(n,k)u^k(1-u)^{n-k} bk,n(u)=C(n,k)uk(1u)nk

其中 n n n表示Bezier的数量, k k k表示混合函数的序号(从0到 n n n), C ( n , k ) = n ! k ! ( n − k ) ! C(n,k)=\frac{n!}{k!(n-k)!} C(n,k)=k!(nk)!n!

给定了控制点的位置 p k p_k pk,控制n维Bezier曲线的函数是:

p ( u ) = ∑ k = 0 n C ( n , k ) u k ( 1 − u ) n − k p(u)=\sum_{k=0}^nC(n,k)u^k(1-u)^{n-k} p(u)=k=0nC(n,k)uk(1u)nk

Bezier具有一些有用的性质:

  1. 曲线被控制点形成的凸包包围
  2. 任何直线与曲线的相交次数不会比它与控制点形成的线段集合的数量多,这个性质称为variation diminishing
  3. 曲线是对称的,倒转控制点的顺序会生成相同的曲线。
  4. 曲线是affine invariant的,这意味着移动,旋转,缩放控制点相当于对曲线进行相同的操作。
  5. 有很多算法用来支持Bezier的细分成多段Bezier曲线。

连接两个Bezier曲线可以通过共享顶点来实现,但是导数的连接性需要通过移动控制点来实现。如果要满足 G 1 G^1 G1连续性需要确保第一条曲线的倒数第二个控制点和第二条曲线的第二个控制点与共享的顶点共线,如果要满足 C 1 C^1 C1连续性,需要确保两个控制点与共线顶点的线段长度相等。

Geometric Intuition for Bezier Curves

在这里插入图片描述

The de Casteljau Algorithm

de Castedljau算法首先连接临近的点,之后找到这些线段的 u u u分割点,连接成 n − 1 n-1 n1条线段,重复该过程直到只有一个点。

在这里插入图片描述

在这个过程中也生成了细分曲线的控制点

在这里插入图片描述

15.6.2 B-Splines

B-Splines可以生成具有任意维度的连续性的曲线。可以通过一系列B-Spline基函数(basis function)的线性组合来表示一个曲线,每一个基函数是由d+1个d维度的多项式组成。通过多个函数的线性组合表示函数的方法是:

f ( t ) = ∑ i = 1 n p i b i ( t )      ( 公 式 4 ) f(t)=\sum_{i=1}^np_ib_i(t)\ \ \ \ (公式4) f(t)=i=1npibi(t)    (4)

其中 p i p_i pi是系数 b i b_i bi是基函数。如果系数是点,那么就认为它们是控制点。生效的关键是正确的定义 b i b_i bi,B-Spline提供了这种方法。

一条由 n n n个点构成的曲线,并具有参数 k k k,其中 k = d + 1 k=d+1 k=d+1具有的性质:

  1. C k − 2 C^{k-2} Ck2连续
  2. 通过 k − 1 k-1 k1维度的多项式组成
  3. 具有局部控制性
  4. 被控制点组成的凸包包围
  5. 表现出图15-6中diminishing的特性

B-Spline不一定内插控制点。

Uniform Linear B-Splines

可以通过公式4利用n个控制点导出一个函数,使用这个函数中的 b i b_i bi以及系数可以创建一个受overall function。如果使用k=2的B-Splines来定义这个overall function,可以得到一个分段多项式,它在t=k到t=k+1之间对系数 p i p_i pi进行线性插值,在这种情况下内插了所有系数。

B-Splines有一些共有的性质:

  1. 每一个B-Spline有k+1个knot
  2. 每一个B-Spline在第一个和最后一个kont之外的范围都等于0
  3. overall spline具有local control,因为每一个系数只影响一个B-Spline
  4. overall spline有n+k个knot
  5. 每一个B-Spline都是 C k − 2 C^{k-2} Ck2的,所以overall spline也是 C k − 2 C^{k-2} Ck2
  6. 在k到n+1之间的knot的参数和等于1,这个性质保证了B-Spline是移动不变的
  7. 在每个knot之间的B-Spline是一个d=k-1维度的单独多项式

Uniform Linear B-Splines中的knot之间的间隔都是统一的。

Uniform Quadratic B-Splines

当k=3时的B-Spline

Uniform Cubic B-Splines

当k=4时的B-Spline

15.6.3 Nonuniform B-Splines

B-Spline的一个优点是可以对于任意k>1进行定义,所以如果需要更加平滑的曲线可以增加k的值。

在这里插入图片描述

对于给定的n和k,B-Splines具有n+k个knot,可以把knot的值表示成一个向量用t表示,对于uniform B-Splines来说这个向量是[1,2,3,…,n+k],但是B-Splines也可以通过任意n+k长度的非降序向量中得到。

nonuniform B-Spline有两个优点:首先可以通过控制每个系数来影响overall funciton的参数范围,第二可以重复knot从而创建出围绕这些点不同属性的函数。

为B-Splines指定knot值的能力类似于为插值spline指定插值site的能力。

一个控制knot的值很有用的地方就是在开始位置插入或删除knot。

定义B-Splines的一般方法:

$$
b_{i,1,\vec{t}}(t)= \begin{cases}
1, if\ \vec{t}{i} \le t{i+1} < \vec{t}_{i+1},\
0, otherwise
\end{cases} \

b_{i,k,\vec{t}}(t)=\frac{t-\vec{t}_i}{\vec{t}_{i+k-1}-\vec{t}_i}b_{i,k-1}(t)+\frac{\vec{t}_{i+k}-t}{\vec{t}_{i+k}-\vec{t}_{i+1}}b_{i+1,k-1}(t)

$$

该公式称为Cox-de Boor recurrence。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值