计算机图形学基础笔记(2.1)

219 阅读11分钟

Category:Higher Mathematics & Computer Graphics Application

正文

2 杂项数学

许多图形只是将数学直接转换为代码。数学越清晰,生成的代码就越清晰;这本书的大部分内容都集中在使用正确的数学来完成这项工作。本章回顾了高中和大学数学中的各种工具,旨在更多地用作参考而不是教程。它可能看起来像是一个大杂烩,事实上确实如此;选择每个主题是因为它在“标准”数学课程中有点不寻常,因为它在图形中具有核心重要性,或者因为它通常不从几何角度处理。除了对书中使用的符号进行回顾外,本章还强调了标准本科课程中有时会跳过的一些要点,例如三角形上的重心坐标。本章不打算对材料进行严格的处理;而是强调直觉和几何解释。线性代数的讨论推迟到第 5 章讨论变换矩阵之前。鼓励读者浏览本章以熟悉所涵盖的主题并在需要时重新参考。本章末尾的练习可能有助于确定哪些主题需要复习。

集合和映射

映射,也称为函数,是数学和编程的基础。与程序中的函数一样,数学中的映射采用一种类型的参数并将其映射到(返回)特定类型的对象。在程序中,我们说“类型”;在数学中,我们将识别集合。当我们有一个对象是集合的成员时,我们使用 ∈ 符号。例如,

image.png
可以读作“a 是集合 S 的成员”。给定任意两个集合 A 和 B,我们可以通过取这两个集合的笛卡尔积来创建第三个集合,记为 A × B。这个集合 A × B 由所有可能的有序对 (a, b) 组成,其中 a ∈ A和 b ∈ B。作为简写,我们使用符号 A2 来表示 A × A。我们可以扩展笛卡尔积以从三个集合中创建一组所有可能的有序三元组,依此类推,从任意多个集合中得到任意长的有序元组.
常见的兴趣集包括:
• R——实数;
• R — 非负实数(包括零);
• R2——真实二维平面中的有序对;
• Rn——n 维笛卡尔空间中的点;
• Z——整数;
• S2——单位球面上的一组 3D 点(R3 中的点)。
请注意,虽然 S2 由嵌入在三维空间中的点组成,但它们位于可以用两个变量参数化的表面上,因此可以将其视为 2D 集。映射表示法使用箭头和冒号,例如:
f : R → Z,
您可以将其解读为“有一个名为 f 的函数,它将实数作为输入并将其映射为整数。”这里,箭头之前的集合称为函数的域,右侧的集合称为目标。
整数 f(real) ← 等价 → f : R → Z。

image.png
所以冒号箭头符号可以被认为是一种编程语法。就这么简单。
点 f(a) 称为 a 的图像,集合 A(域的子集)的图像是目标的子集,其中包含 A 中所有点的图像。
整个域的图像称为函数的范围。

逆映射

注: (-1是-1次方,反函数,因为格式问题,后续我再统一替换)
如果我们有一个函数 f : A → B,则可能存在一个反函数 f -1 : B → A,它由规则 f -1(b) = a where b = f(a) 定义。只有当每个 b ∈ B 都是 f 下某个点的图像(即范围等于目标)并且只有一个这样的点(即只有一个 a 对应于 f(a) = b)。这种映射或函数称为双映射(双向可逆函数)。双映射将每个 a ∈ A 映射到一个唯一的 b ∈ B,并且对于每个 b ∈ B,恰好有一个 a ∈ A 使得 f(a) = b(图 2.1)。一组骑手和马匹的双射表示每个人都骑一匹马,每匹马都被骑过。这两个功能将是骑手(马)和马(骑手)。这些是彼此的反函数。不是双映射的函数没有逆函数(图 2.2)。(g函数就不是双映射)

image.png
双映射的一个例子是 f : R → R,其中 f(x) = x3。反函数为 f −1(x) = 3√x。这个例子表明标准符号可能有点尴尬,因为 x 在 f 和 f -1 中都被用作虚拟变量。有时使用不同的虚拟变量更直观,其中 y = f(x) 和 x = f-1(y)。这会产生更直观的 y = x3 和 x = 3√y。没有逆函数的示例是 sqr : R → R,其中 sqr(x) = x2。这是正确的,原因有两个:首先 x2 = (-x)²,其次没有域的成员映射到目标的负部分。请注意,如果我们将域和范围限制为 R,我们可以定义一个逆。那么 √x 是一个有效的逆。

2.1.2 间隔

通常我们希望指定一个函数处理值受限的实数。一个这样的约束是指定一个间隔。区间的一个示例是零和一之间的实数,不包括零或一。
我们将其表示为 (0, 1)。因为它不包括其端点,所以这称为开区间。包含其端点的相应闭区间用方括号表示:[0, 1]。这种表示法可以混合使用,即 [0, 1)包括零但不包括一。在写区间 [a, b] 时,我们假设 a ≤ b。表示区间的三种常用方法如图 2.3 所示。

image.png
经常使用区间的笛卡尔积。例如,为了表示点 x 在 3D 单位立方体中,我们说 x ∈ [0, 1]3(三次方)。
区间与集合运算结合使用特别有用:交集、并集和差集。例如,两个区间的交集就是它们共有的点集。符号∩用于交集。例如,[3, 5)∩[4, 6] = [4, 5)。对于并集,符号 ∪ 用于表示任一区间中的点。例如,[3, 5)∪[4, 6] = [3, 6]。与前两个运算符不同,差异运算符根据参数顺序产生不同的结果。
减号用于差分运算符,它返回左侧区间中不在右侧的点。例如,[3, 5) - [4, 6] = [3, 4) 和 [4, 6] - [3, 5) = [5, 6]。使用区间图(图 2.4)特别容易将这些操作可视化。

image.png

2.1.3 对数

尽管今天不像在计算器之前那样普遍,但对数通常在出现具有指数项的方程的问题中很有用。根据定义,每个对数都有一个底 a。 x 的“对数基数 a”写成 loga x 并定义为“为得到 x 必须提高 a 的指数”,即,

image.png
请注意,以 a 为底的对数和将 a 乘以幂的函数互为倒数。这个基本定义有几个后果:

image.png
当我们将微积分应用于对数时,特殊数 e = 2.718 ... 经常出现。以 e 为底的对数称为自然对数。我们采用常用的简写 ln 来表示:
image.png
请注意,“≡”符号可以理解为“在定义上是等价的”。与 π 一样,特殊数字 e 出现在大量上下文中。除了 e 之外,许多字段还使用特定的基数进行操作,并在其符号中省略基数,即 log x。例如,天文学家经常使用以 10 为底,而理论计算机科学家经常使用以 2 为底。因为计算机图形学借鉴了许多领域的技术,我们将避免这种速记。
对数和指数的导数说明了为什么自然对数是“自然的”:

image.png
上面的常数乘数仅对 a = e 是统一的。

2.2 求解二次方程

二次方程的形式为
image.png
其中 x 是实数未知数,A、B 和 C 是已知常数。如果您考虑 y = Ax2 + Bx + C 的 2D xy 图,则解决方案就是 x 值是 y 中的“零交叉”。因为 y = Ax2 + Bx + C是一条抛物线,所以根据抛物线是否未命中、擦过或击中 x 轴,将有零个、一个或两个实数解(图 2.5)。
image.png
为了解析求解二次方程,我们首先除以 A:
image.png
然后我们以“完全平方和”对术语进行分组:
image.png
将常数部分移到右侧并取平方根得到
image.png
从两边减去 B/(2A) 并用分母 2A 对项进行分组,得到熟悉的形式:
image.png
这里的“±”符号表示有两种解决方案,一种带有加号,一种带有减号。因此 3 ± 1 等于“二或四”。请注意,确定实际解决方案数量的项是
image.png
称为二次方程的判别式。如果 D > 0,则有两个实解(也称为根)。如果 D = 0,则存在一个实解(“双”根)。如果 D < 0,则没有真正的解决方案。
例如,2x2 + 6x +4=0的根是 x = -1 和 x = -2,方程x2+x+1没有实解。这些方程的判别式分别为 D = 4 和 D = -3,因此我们期望给出的解数。
在程序中,如果 D 为负数,通常最好先评估 D 并返回“无根”而不取平方根

2.3 三角学

在图形中,我们在许多情况下使用基本三角学。通常,它没有什么太花哨的,而且通常会有助于记住基本定义。

2.3.1 角度

尽管我们认为角度有些理所当然,但我们应该回到它们的定义,以便我们可以将角度的概念扩展到球体上。两个半线(源自原点的无限光线)或方向之间形成一个角度,必须使用一些约定来确定它们之间创建的角度的两种可能性,如图 2.6 所示。(两条半线将单位圆切割成两条弧线。任一弧的长度是两条半线“之间”的有效角度。我们可以使用较小的长度是角度的约定,或者两条半线以特定顺序指定,并且确定角度 φ 的弧是从第一条半线到第二条半线逆时针扫过的弧。)
image.png
角度由它在单位圆上切出的弧段的长度定义。一个常见的约定是使用较小的弧长,并且角度的符号由指定两条半线的顺序确定。使用该约定,所有角度都在 [−π, π] 范围内。
这些角度中的每一个都是被两个方向“切割”的单位圆弧的长度。因为单位圆的周长是 2π,所以两个可能的角度之和为 2π。这些弧长的单位是弧度。另一个常见的单位是度,圆的周长是 360 度。因此,π 弧度的角度是 180 度,通常表示为 180°。度数(degrees)和弧度(radians)之间的转换是
image.png

2.3.2 三角函数

给定一个边长为 a、o 和 h 的直角三角形,其中 h 是最长边(总是与直角相反)或斜边的长度,勾股定理描述了一个重要的关系:
image.png
从图 2.7 中可以看出这是正确的,其中大正方形的面积为 (a+o)²,四个三角形的总面积为 2ao,而中心正方形的面积为 h²。
image.png
因为三角形和内部正方形均匀地细分了较大的正方形,所以我们有 2ao + h² = (a + o)²,很容易将其操作为上面的形式。
我们定义 φ 的正弦和余弦,以及其他基于比率的三角表达式:
image.png
这些定义允许我们设置极坐标,其中一个点被编码为与原点的距离和相对于正 x 轴的有符号角度(图 2.8)。
image.png
请注意角度在 φ ∈ (−π, π] 范围内的约定,并且正角度从正 x 轴逆时针方向。逆时针映射到正数的约定是任意的,但它在许多情况下使用在图形中,因此值得致力于内存。
三角函数是周期性的,可以采用任何角度作为参数。
例如,sin(A) = sin(A + 2π)。这意味着当考虑域 R 时,这些函数是不可逆的。通过限制标准反函数的范围来避免这个问题,并且这在几乎所有现代数学库中都以标准方式完成(例如,(Plauger,1991)) .域和范围(值)是:
image.png
最后一个函数 atan2(s, c) 通常非常有用。它采用与 sin A 成比例的 s 值和将 cos A 按相同因子缩放并返回 A 的 c 值。假定因子为正。考虑这一点的一种方法是它返回极坐标中二维笛卡尔点 (s, c) 的角度(图 2.9)。
image.png

2.3.3 有用的推导等式

本节未经推导列出了各种有用的三角恒等式。
转换等式: image.png
毕达哥拉斯恒等式:
image.png
加减恒等式:
image.png
半角恒等式:
image.png
推导恒等式:
image.png
以下恒等式适用于边长为 a、b 和 c 的任意三角形,每个三角形的对角分别由 A、B、C 给出(图 2.10):
image.png
image.png
三角形的面积也可以根据这些边长计算:
image.png