Category:Higher Mathematics & Computer Graphics Application
正文
2.6 线性插值
也许图形中最常见的数学运算是线性插值。我们已经看到了位置线性插值以形成 2D 和 3D 线段的示例,其中两个点 a 和 b 与参数 t 相关联以形成线 p = (1 - t)a tb。这是插值,因为 p 恰好在 t = 0 和 t = 1 处经过 a 和 b。它是线性插值,因为加权项 t 和 1 - t 是 t 的线性多项式。
另一种常见的线性插值是在 x 轴上的一组位置中:x0、x1、...、xn,对于每个 xi,我们都有一个关联的高度 yi。我们想要创建一个连续函数 y = f(x) 对这些位置进行插值,以便 f 遍历每个数据点,即 f(xi) = yi。对于线性插值,点 (xi, yi) 由直线段连接。对这些线段使用参数线方程是很自然的。参数 t 只是 xi 和 xi 1 之间的小数距离:
因为加权函数是 x 的线性多项式,所以这是线性插值。
上面的两个示例具有线性插值的常见形式。当我们从数据项 A 移动到数据项 B 时,我们创建了一个从 0 变化到 1 的变量 t。中间值就是函数 (1 − t)A tB。请注意,方程 (2.26) 具有这种形式:
2.7 线性插值
2D 和 3D 中的三角形是许多图形程序中的基本建模原语。通常,诸如颜色之类的信息被标记到三角形顶点上,并且这些信息被插入到整个三角形中。使这种插值简单化的坐标系称为重心坐标。我们将从头开始开发这些。我们还将讨论 2D 三角形,在我们可以在 2D 屏幕上绘制它们的图片之前必须了解这些。
2.7.1 二维三角形
如果我们有一个由二维点 a、b 和 c 定义的二维三角形,我们可以首先找到它的面积:
这个公式的推导可以在第 5.3 节中找到。如果 a、b 和 c 点按逆时针顺序排列,则该区域为正号,否则为负号。
通常在图形中,我们希望在每个三角形顶点分配一个属性,例如颜色,并在三角形上平滑地插入该属性的值。
有多种方法可以做到这一点,但最简单的是使用重心坐标。将重心坐标视为非正交坐标系的一种方法是在第 2.4.2 节中简要讨论过。这样的坐标系如图 2.36 所示,其中坐标原点是 a,从 a 到 b 和 c 的向量是基向量。有了那个原点和那些基向量,
任何点P都可以写作:
请注意,我们可以在公式(2.28)中重新排序术语以获取
人们经常定义一个新变量 α 来改善方程的对称性:
可产生方程:
具有以下约束:
重心坐标起初似乎是一个抽象且不直观的结构,但事实证明它们功能强大且方便。您可能会发现考虑街道地址如何在有两组平行街道但这些组不成直角的城市中如何工作很有用。自然系统本质上是重心坐标,你很快就会习惯它们。
为平面上的所有点定义重心坐标。重心坐标的一个特别好的特性是点 p 在由 a、b 和 c 组成的三角形内当且仅当
如果其中一个坐标为零,而另外两个坐标介于零和一之间,则您处于边缘。如果其中两个坐标为零,则另一个为一,并且您位于顶点。重心坐标的另一个很好的特性是方程(2.29)实际上以平滑的方式混合了三个顶点的坐标。相同的混合系数(α、β、γ)可用于混合其他属性,例如颜色,我们将在下一章中看到。
给定一个点 p,我们如何计算它的重心坐标?一种方法是将方程 (2.28) 写为具有未知数 β 和 γ 的线性系统,求解并设置 α = 1 - β - γ。该线性系统是
虽然用代数方法求解方程 (2.31) 很简单,但计算直接几何解通常是富有成效的。
重心坐标的一个几何特性是它们是从线到三角形边的有符号比例距离,如图 2.37 中的 β 所示。回想一下 2.5.2 节,对 f(x, y)=0 线求方程 f(x, y) 会返回从 (x, y) 到线的缩放有符号距离。还记得如果 f(x, y)=0 是特定线的方程,那么对于任何非零 k,kf(x, y)=0 也是如此。更改 k 缩放距离并控制线的哪一侧具有正符号距离,哪一侧具有负符号距离。我们想选择 k 使得例如 kf(x, y) = β。由于 k 只是一个未知数,我们可以通过一个约束来强制执行此操作,即在点 b 我们知道 β = 1。因此,如果线 fac(x,y)=0 同时经过 a 和 c,那么我们可以计算 β对于点 (x, y) 如下:
我们可以用类似的方式计算 γ 和 α。为提高效率,通常明智的做法是直接计算仅两个重心坐标并使用公式 (2.30) 计算第三个。
为了找到通过 p0 和 p1 的线的这种“理想”形式,我们可以首先使用第 2.5.2 节的技术来找到一些通过顶点的有效隐式线.
方程(2.17)给了我们:
请注意 fab(xc, yc) 可能不等于 1,因此它可能不是我们寻求的理想形式。通过除以 fab(xc, yc) 我们得到
除法的存在可能会让我们担心,因为它引入了被零除的可能性,但对于面积不接近零的三角形来说,这不会发生。 α 和 β 有类似的公式,但通常只需要一个:
计算重心坐标的另一种方法是计算子三角形的面积 Aa、Ab 和 Ac,如图 2.38 所示。
重心坐标遵守规则:
其中 A 是三角形的面积。请注意,A = Aa Ab Ac,因此可以通过两次加法而不是全面积公式来计算。如果允许对三角形区域进行签名,则此规则仍然适用于三角形之外的点。其原因如图 2.39 所示。
请注意,这些是有符号面积,只要对 A 和子三角形 Aa、Ab 和 Ac 使用相同的有符号面积计算,就可以正确计算这些面积。
2.7.2 三维三角形
重心坐标的一个奇妙之处在于它们几乎透明地扩展到 3D。如果我们假设点 a、b 和 c 是 3D 的,那么我们仍然可以使用表示
现在,随着我们改变 β 和 γ,我们扫出了一个平面。
三角形的法线向量可以通过取三角形平面内任意两个向量的叉积来求得(图 2.40)。
使用三个边中的两个作为这些向量是最简单的,例如,
注意这个法向量不一定是单位长度的,它遵循叉积的右手法则。
通过取叉积的长度可以找到三角形的面积:
请注意,这不是带符号的区域,因此不能直接用于评估重心坐标。但是,我们可以观察到,具有“顺时针”顶点顺序的三角形将具有一个法向量,该法向量指向与具有“逆时针”顶点顺序的同一平面中的三角形的法线相反的方向。
回顾:
其中 φ 是向量之间的角度。如果 a 和 b 平行,则 cos φ = ±1,这可以测试向量是指向相同方向还是指向相反方向。
这与等式 (2.33)、(2.34) 和 (2.35) 一起提出了公式
其中 n 是用顶点 a、b 和 c 计算的等式 (2.34); na 是用顶点 b、c 和 p 等计算的等式 (2.34),即
经常问的问题
• 为什么没有向量除法?
事实证明,向量的除法没有“好的”类比。但是,可以通过详细研究这个问题来激发四元数(参见章节注释中引用的霍夫曼的书)。
• 对于多于三边的多边形,是否有像重心坐标一样干净的东西?
不幸的是没有。即使是凸四边形也要复杂得多。这是三角形在图形中如此常见的几何图元的一个原因。
• 3D 线是否有隐含形式?
不可以。但是,两个 3D 平面的交点定义了一条 3D 线,因此一条 3D 线可以用两个联立的隐式 3D 方程来描述。
注释
矢量分析的历史特别有趣。它主要是由 Grassman 在 1800 年代中期发明的,但后来被忽略并重新发明(Crowe,1994)。现在,Grassman 在图形领域拥有一批追随者,他们正在根据他的一些想法开发几何代数(Doran & Lasenby,2003 年)。对为什么特定的标量和向量积在某种意义上是正确的,以及为什么我们没有常用的向量除法感兴趣的读者,将从简明的 About Vectors (Hoffmann, 1975) 中得到启发。
练习题
- 集合的基数是它包含的元素的数量。在 IEEE 浮点表示(第 1.5 节)下,浮点数的基数是多少?
- 是否可以实现一个函数,将 32 位整数映射到 64 位整数,并具有明确定义的逆?从 32 位整数到 64 位整数的所有函数都有明确定义的逆吗?
- 根据三个区间的笛卡尔积指定单位立方体(x、y 和 z 坐标均在 0 和 1 之间)。
- 如果您可以访问自然对数函数 ln(x),请指定如何使用它来实现 log(b, x) 函数,其中 b 是对数的基数。对于负 b 值,该函数应该做什么?假设一个 IEEE 浮点实现。
- 求解二次方程 2x2 6x 4=0。
- 实现一个函数,该函数采用二次方程 Ax2 Bx C = 0 的系数 A、B 和 C,并计算两个解。让函数返回有效(非 NaN)解决方案的数量并填写返回参数,以便两个解决方案中的较小者优先。
- 证明第 17 页的二次公式的两种形式是等价的(假设算术精确),并解释如何为 2.7 中的每个根选择一种。三角形 51 是为了避免减去几乎相等的浮点数,这会导致精度损失。
- 通过反例证明,对于 3D 向量 a、b 和 c,a × (b × c)=(a × b) × c 并不总是正确的。
- 给定非平行的 3D 向量 a 和 b,计算一个右手正交基,使得 u 平行于 a 并且 v 在由 a 和 b 定义的平面内。
- f(x, y, z) = x2 y − 3z3 的梯度是多少?
- 什么是轴对齐二维椭圆的参数形式?
- 平面通过 3D 点 (1, 0, 0)、(0, 1, 0) 和 (0, 0, 1) 的隐式方程是什么?什么是参数方程?这个平面的法向量是多少?
- 给定四个二维点 a0、a1、b0 和 b1,设计一个稳健的程序来确定e 线段 a0a1 和 b0b1 是否相交。
- 设计一个稳健的程序来计算一个二维点相对于三个二维非共线点的重心坐标。
你真棒,看到了这里。至此,第二章结束啦~~