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

2.1 Sets and Mappings(集合和映射)

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

截屏2023-09-24 22.54.26.png

可以读作“它是集合S的成员”给定任意两个集合a和b,我们可以通过取这两个集合的笛卡尔积(Cartesian product)来创建第三个集合,记为A×B。这个集合A×B由所有可能的有序对(a, b)组成,其中a∈a, b∈b。作为一种简写,我们使用$A^2$表示A×A。我们可以扩展笛卡尔积,从三个集合中创建一个由所有可能的有序三元组组成的集合,以此类推,对于任意多集合的任意长有序元组。

常见的有趣集合包括:

截屏2023-09-24 22.59.29.png

请注意,虽然s2是由嵌入在三维空间中的点组成的,但它位于一个可以用两个变量参数化的表面上,因此它可以被认为是一个二维集合。映射的符号使用箭头和冒号,例如:

截屏2023-09-24 23.01.56.png

你可以把它读成“有一个函数,它把一个实数作为输入,并把它映射成一个整数。”在这里,箭头之前的集合称为函数的域,右边的集合称为目标。计算机程序员可能更熟悉下面的等效语言:“有一个名为f的函数,它有一个实参并返回一个整数。”换句话说,上面的集合表示法等价于通用编程表示法:

截屏2023-09-24 23.03.15.png

因此,冒号箭头符号可以被认为是一种编程语法。就是这么简单。

点f(a)称为a的像(image),集合A的像(定义域的子集)是包含A中所有点的像的目标的子集,整个定义域的像称为函数的值域(range)。

2.1.1 Inverse Mappings(逆映射)

若有一个函数f: A→B,则可能存在一个逆函数$f^{-1}$: B→A,它由规则$f^{-1}$(b) = a定义,其中b = f(a)。这个定义只有在每个$b\in B$都是某个点在f下的像(即,值域等于目标)并且只有一个这样的点(即,只有一个a使f(a) = b)时才成立。这样的映射或函数称为双射(bijection)。一个双射将每个a$\in$A映射到一个唯一的b$\in$B,对于每个b$\in$B,都有一个a$\in$A使得f(a) = b(图2.1)。一群骑手和马之间的双射表示每个人都骑一匹马,每匹马都有人骑。这两个函数分别是 骑手(马)和 马(骑手)。它们是彼此的反函数。非双射函数没有逆函数(图2.2)。

双射的一个例子是f: R→R,其中f(x) =$x^3$。反函数是$f^{-1}$(x) = pow(x, 1/3)。这个例子表明,标准表示法可能有些尴尬,因为x在f和$f^{-1}$ 中都被用作哑变量。有时使用不同的虚拟变量更直观,如y = f(x)和x = $f^{-1}$ (y)。这就产生了更直观的y = $x^3$和x = pow(y, 1/3)。一个没有逆函数的例子是sqr: R→R,其中sqr(x) = $x^2$。这有两个原因:首先$x^2=(-x)^2$,其次没有定义域的成员映射到目标的负部分。注意,如果我们将定义域和值域限制为$R^+$,我们可以定义逆。那么,pow(x, 1/2)是一个有效的逆函数。

2.1.2 Intervals(区间)

通常,我们希望指定一个函数处理在值上有限制的实数。其中一个约束是指定一个区间。区间的一个例子是0到1之间的实数,不包括0和1。记为(0,1)因为它不包括端点,所以它被称为开区间。对应的封闭区间包含其端点,用方括号表示:[0,1]。这种符号可以混合使用;即,[0,1)包含0但不包含1。当写区间[a, b]时,我们假设a$\le$b.表示区间的三种常用方法如图2.3所示。区间的笛卡尔积是常用的。例如,要表示一个点x在三维的单位立方体中,我们说 $x\in[0,1]^3$。

区间在与集合操作(交集intersection、并集union和差difference)结合时特别有用。例如,两个区间的交集是它们共有的点的集合。符号$\cap$是用来表示交点的。例如,[3,5)$\cap$[4,6] =[4,5]。对于并集,符号U用于表示任意区间内的点。例如,[3,5)U[4,6] =[3,6]。与前两个操作符不同,差操作符根据参数顺序产生不同的结果。 负号用于差分运算符,它返回左边区间中不在右边区间中的点。例如,[3,5) - (4,6] = [3,4), [4,6] - [3,5) = [5,6]。使用间隔图(图2.4),这些操作特别容易可视化。

2.1.3 Logarithms(对数)

虽然相对计算器出现之前,对数已经不那么普遍了,但在出现指数项方程的问题中,对数还是很有用的。根据定义,每个对数都有一个以a为底的对数。x的“以a为底的对数”写为$log_ax$,并被定义为“a必须被取若干倍才能得到x的指数”,即:

截屏2023-09-26 22.34.06.png

注意以a为底的对数和以a为次幂的函数是互为反比的。这个基本定义有几个结论:

截屏2023-09-26 22.35.54.png

当我们将微积分应用于对数时,特殊数e = 2.718…经常出现。以e为底的对数称为自然对数。我们采用常用的简写In来表示它:

截屏2023-09-26 22.37.06.png

截屏2023-09-24 23.26.35.png

截屏2023-09-26 22.24.21.png

截屏2023-09-26 22.29.56.png

请注意,“$\equiv$”符号可以读作“根据定义是等效的”。像n一样,特殊数字e在很多情况下都会出现。许多字段除了使用e之外还使用一个特定的基数进行操作,并且在其符号中省略了基数,例如,天文学家通常使用10为基数,理论计算机科学家通常使用2为基数。由于计算机图形学借鉴了许多领域的技术,我们将避免这种简写。

对数和指数的导数说明了为什么自然对数是“自然的”:

截屏2023-09-26 22.40.49.png

上述常数乘数仅在a = e时为1单位。

2.2 Solving Quadratic Equations(解二次方程)