这一章内容繁杂,暂时跳过
本章是数学知识大杂烩,仅作为参考而非严密教程。与“标准数学”的区别在于,本章着重于强调几何解释。建议读者跳过熟悉的内容,在需要时再返回来参阅。
平面以及空间三角形是许多图形程序中的基本建模图元,通常像颜色之类的信息都是被附加在三角形顶点之上的,在整个三角形上进行插值。
有一种坐标表示法可以让这个插值变得简单、直接,它就是重心坐标。
对于一个顶点为\(a\),\(b\),\(c\)的平面三角形,它的有向面积为:
$$ Area = \frac{1}{2} \begin{vmatrix} x_b - x_a & x_c - x_a \\ y_b - y_a & y_c - y_a \end{vmatrix} $$当\(a\),\(b\),\(c\)为逆时针排列时,该面积为正值,否则为负值。
重心坐标是一种非正交的坐标系,如下图所示,这样的坐标系以\(a\)为原点,\(a\)到\(b\)和\(c\)的向量为基向量。
重心坐标系
这样平面上任意一点\(\textbf{p}\)可以表示为:
$$ \textbf{p} = \textbf{a} + \beta (\textbf{b} - \textbf{a}) + \gamma (\textbf{c} - \textbf{a}) $$重新整理一下上式:
$$ \textbf{p} = (1-\beta-\gamma) \textbf{a} + \beta \textbf{b} + \gamma \textbf{c} $$为了对称性,可定义变量\(\alpha\):
$$ \alpha = 1 - \beta - \gamma $$得到如下方程:
$$ \textbf{p}(\alpha, \beta, \gamma) = \alpha \textbf{a} + \beta \textbf{b} + \gamma \textbf{c} $$$$ \alpha + \beta + \gamma = 1 $$该坐标表示有一个很好的特点,当\(\textbf{p}\)在以\(a\),\(b\),\(c\)为顶点的三角形内部时,当且仅当:
$$ 0 < \alpha < 1 $$$$ 0 < \beta < 1 $$$$ 0 < \gamma < 1 $$给定任意点\(\textbf{p}\),求解如下方程可得其重心坐标:
$$\left\{\begin{matrix} \begin{bmatrix} x_b - x_a & x_c - x_a \\ y_b - y_a & y_c - y_a \end{bmatrix} \begin{bmatrix} \beta \\ \gamma \end{bmatrix} \begin{bmatrix} x_p - x_a \\ y_p - y_a \end{bmatrix} \\ \alpha = 1 - \beta - \gamma \end{matrix}\right.$$在几何上,\(\textbf{p}\)的重心坐标与其与三边组成三角形的有向面积有关:
$$ \alpha = A_a / A $$$$ \beta = A_b / A $$$$ \gamma = A_c / A $$有向面积计算重心坐标
重心坐标也可扩展到三维情形,假设有三个空间点\(a\),\(b\),\(c\),可以这样表示:
$$ \textbf{p} = (1-\beta-\gamma)\textbf{a} + \beta \textbf{b} + \gamma \textbf{c} $$通过改变\(\beta\)和\(\gamma\),可以扫掠整个平面。
三角面的法向量可以用两条边向量的叉积计算:
$$ \textbf{n} = (\textbf{b} - \textbf{a}) \times (\textbf{c} - \textbf{a}) $$三角形面积:
$$ area = \frac{1}{2} || (\textbf{b} - \textbf{a}) \times (\textbf{c} - \textbf{a}) || $$注意,这个公式计算得到的不是有向面积。
但我们仍然可以通过判断子三角形与主三角形的法向量符号关系来判断其有向面积符号,从而计算空间三角形的重心坐标:
$$ \alpha = \frac{\textbf{n} \cdot \textbf{n}_a}{||\textbf{n}||^2} $$$$ \beta = \frac{\textbf{n} \cdot \textbf{n}_b}{||\textbf{n}||^2} $$$$ \gamma = \frac{\textbf{n} \cdot \textbf{n}_c}{||\textbf{n}||^2} $$其中:
$$ \textbf{n}_a = (\textbf{c} - \textbf{b}) \times (\textbf{p} - \textbf{b}) $$$$ \textbf{n}_b = (\textbf{a} - \textbf{c}) \times (\textbf{p} - \textbf{c}) $$$$ \textbf{n}_c = (\textbf{b} - \textbf{a}) \times (\textbf{p} - \textbf{a}) $$