Loading... ## Vector ### Cross Product 叉积,简单回顾一下 $$ ||\vec{a} \times \vec{b}|| = ||a||||b|| \sin \phi $$ 而 $\vec{a} \times \vec{b}$ 的方向可以用右手系来判断。 在笛卡尔坐标系中,其结果可以用: $$ \vec{a} \times \vec{b} = (y_az_b - z_ay_b, z_ax_b - x_az_b, x_ay_b - y_ax_b) $$ ### Orthonormal Bases #### Constructing a Basis from a Single Vector 利用单个向量构造正交基 首先取该向量的方向向量: $$ \vec{w} = \frac{\vec{a}}{||\vec{a}||} $$ 之后选取任意一个与 $\vec{w}$ 不共线的向量 $\vec{t}$,利用叉积来构造与 $\vec{w}$ 正交的单位向量 $$ \vec{u} = \frac{\vec{t} \times \vec{w}}{||\vec{t} \times \vec{w}||} $$ #### Constructing a Basis from a Single Vector 将 $\vec{u}$ 构造中的 $\vec{t}$ 替换成第二个向量 $\vec{b}$ 即可。 ## Curves and Surfaces ### 2D Implicit Curves 一种常见的描述二维曲线的方法是隐等式(*Implicit Equation*)。二维曲线的一般形式是: $$ f(x,y) = 0 $$ 其中, 点 $(x,y)$ 是 $f(x,y)=0$ 的根,表示该点在曲线上。反之则不在。例如,一个圆可以表示为 $f(x,y) = (x-x_c)^2 + (y - y_c)^2 -r^2$ 。因为在曲线上的点并非显式地表达出来,而是要解这个等式,所以成为 Implicit Equation。 此外,我们还可以用向量来压缩我们的表达式。如果我们有 $\vec{c} = (x_c, y_c)$ 和 $\vec{p} = (x,y)$,那么以 $(x_c, y_c)$ 为圆心 $r$ 为半径的原则可以用这些满足以下条件的**位置向量**来表示: $$ (\vec{p} - \vec{c}) \cdot (\vec{p} - \vec{c}) - r^2 = 0 $$ 由点积的性质可知,该式也等价于: $$ \vert \vert \vec{p} - \vec{c} || -r^2 = 0 $$ ### 2D Gradient 这一节我们讨论2D梯度 假如我们认为 $f(x,y)$ 是一块高地且高度$=f(x,y)$,那么梯度向量指向的是最大向上斜率的方向。梯度向量 $\nabla f(x,y)$ 由下式给出: $$ \nabla f(x,y) = (\frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}) $$ 在一个在隐曲线 $f(x,y) = 0$ 上的点测量的梯度向量是与 tangent vector 在该点垂直的一个向量。这个垂直的向量通常称为 normal vector (法向量)。因为梯度向量指向的是最大向上斜率的方向,这说明了梯度向量指向了 $f(x,y) > 0$ 的区域。 ### 3D Implicit Surfaces 类似于 2D 的情形,我们可以简单给出 3D Implicit Equation 来描述一个 3D 平面 $$ f(x,y,z) = 0 $$ 同理,可以用向量来表示。有 $\vec{p} =(x,y,z)$ ,上式可以重写为: $$ f(\vec{p}) = 0 $$ ### Surface Normal to an Implicit Surface Surface Normal,即法线。其目的是为了减小计算量,是一个垂直于平面的向量。 任意一个在平面上的点都有可能有不同的法向量。类似地,梯度为2D隐曲线指出了一条法线,在点 $\vec{p}$ 处的3D平面发现由隐函数的梯度给出: $$ \vec{n} = \nabla f(\vec{p}) = (\frac{\partial f(\vec{p}}{\partial x}, \frac{\partial f(\vec{p})}{\partial y}, \frac{\partial f(\vec{p})}{\partial z}) $$ ### Implicit Planes 上面提到了法线。我们是否可以用法线来定义一个平面? 假如我们有一个无限平面,穿过点 $\vec{a}$,且在该点有法线 $\vec{n}$。则该平面的 Implicit Equation 可以表达为: $$ (\vec{p} - \vec{a}) \cdot \vec{n} = 0 $$ 其中 $\vec{p}$ 是一个任意的在平面上的点。这个等式实际上是在描述:一个从 $\vec{a}$ 到 $\vec{p}$ 的向量是垂直于平面法线 $n$ 的。如果 $\vec{p}$ 不在该平面内,则该等式不成立。 有时候我们需要找到一个包含点 $\vec{a}, \vec{b}, \vec{c}$ 的平面。该平面的法线可以用该平面内的任意两个向量的叉积给出: $$ \vec{n} = (\vec{b} - \vec{a})\times (\vec{c} - \vec{a}) $$ 利用上式,可以重写本节的第一个式子: $$ (\vec{p} - \vec{a}) \cdot ((\vec{b} - \vec{a}) \times (\vec{c} - \vec{a})) = 0 $$ 该式可以这么理解:由 $\vec{p} - \vec{a}$ , $\vec{b} - \vec{a}$ 和 $\vec{c} - \vec{a}$ 定义的平行管的体积为 $0$,即他们是共面的。 一个 Full-Brown 的笛卡尔表示由行列式给出: $$ \begin{Vmatrix} x - x_a & y - y_a & z - z_a \\ x_b - x_a & y_b - y_a & z_b - z_a \\ x_c-x_a & y_c - y_a & z_c-z_a\end{Vmatrix} = 0 $$ 本质上,上两式是等价的。且两者都容易用来进行编程。 #### 3D Quadric Surfaces 类似于二次多项式可以用来定义2D中的二次曲线,由 $x,y,z$ 组成的二次多项式可以用来在 3D 中定义二次平面。例如,一个球可以表示成: $$ f(\vec{p}) = (\vec{p} - \vec{c})^2 - r^2= 0 $$ 一个在固定在轴上的椭球可以如下表示: $$ f(\vec{p}) = \frac{(x-x_c)^2}{a^2} + \frac{(y-y_c)^2}{b^2} + \frac{(z-z_c)^2}{c^2} - 1 = 0 $$ #### 3D Curves from Implicit Surfaces 根据3D Implicit Surface 的启发,3D implicit curve 是否可以用 $f(\vec{p}) = 0$ 来描述呢?答案是可以的。但是所有这些曲线都只是退化曲面 (Degenerate Surface),在实践中很少有用。Degenerate Surface 就是会在一条线或者一个点上坍缩的一个平面。其实由定义可以联想到这一性质。 一条 3D 曲线可以由两个 Implicit equations 的节点同时构造出来: $$ f(\vec{p}) = 0, g(\vec{p}) = 0 $$ 例如,一条 3D Curves 可以由它截的两个平面来表示。 一种更简便的方法是用参数式来表示。 ### 2D Parametric Curves 一个用参数来描述的曲线,使用单参数来控制的。这个参数可以被视为一种在曲线上连续的*索引*。这样的曲线可以由这种形式来表示: $$ \begin{bmatrix} x \\ y \end{bmatrix} = \begin{bmatrix} g(t) \\ h(t) \end{bmatrix} $$ 该式中,$(x,y)$ 是在曲线上的一个点。$t$ 是一个影响这条曲线的一个参数。对于一个给定的 $t$,一些点是由函数 $g$ 和 $h$ 来决定的。对于连续的 $g$ 和 $h$,$t$ 的微小变化就会体现在 $x,y$ 的微笑变化中。所以,当 $t$ 连续的变化的时候,$(x,y)$ 也连续的被勾勒出来。 这是一种很好的特性,因为我们可以用参数 $t$ 来显式地构造在曲线上的点。 通常,我们可以用向量的形式来写一个参数式的曲线: $$ \vec{p} = f(t) $$ 其中,$f$ 是一个 vector-valued 的函数, $f: \mathbb{R} \rightarrow \mathbb{R}^2$。 #### 2D Parameter Lines 一条经过 $\vec{p_0} =(x_0, y_0)$ 和 $\vec{p_1} = (x_1, y_1)$ 的点可以写做: $$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_0 + t(x_1-x_0) \\ y_0 + t(y_1-y_0)\end{bmatrix} $$ 上式中, $x, y$ 给出的形式非常类似,我们可以用一个更简单的向量形式来表达。对于 $\vec{p} = (x,y)$: $$ \vec{p}(t) = \vec{p_0} + t(\vec{p_1 - \vec{p_0}}) $$ 另外一种只用一个点 $\vec{o}$ 和一个向量 $\vec{d}$ 的表达方式是: $$ \vec{p}(t) = \vec{o} + t(\vec{d}) $$ 当向量 $\vec{d}$ 的模长为单位长度时,这条线被称作 *arc-length parameterized* (弧长参数化)的。这指出,参数 $t$ 就是这条线上长度的。任何参数式的曲线都可以被弧长参数化。弧长参数化式显然是一种非常方便的形式。 #### 2D Parametric Curves 圆心在 $(x_c, y_c)$ 半径为 $r$ 的圆有参数式: $$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_c+r\cos \phi \\ y_c + r \sin \phi \end{bmatrix} $$ 为了保证参数 $\phi$ 是一个独特的参数,对于每一个在曲线上的点,我们可以限制其定义域 $\phi \in [0,2\pi)$ 或者 $\phi \in (-\pi, \pi]$。 一个轴在坐标轴上的椭圆可以用不同的尺寸的 $x,y$ 来构造参数等式来表达: $$ \begin{bmatrix} x \\ y\end{bmatrix} = \begin{bmatrix} x_c+a \cos \phi \\ y_c + b\sin\phi \end{bmatrix} $$ ### 3D Parametric Curves 类似于 2D 的情况,3D Parametric Curves 可以表示为: $$ x = f(t), y = g(t), z=h(t) $$ 例如,一个围着 $z$ 轴的螺旋状曲线可以写作: $$ x = \cos t, y = \sin t, z = t $$ 同理,如果我们要控制曲线的起点和终点,函数 $f,g,h$ 定义在 $D \subset \mathbb{R}$ 。其向量形式可以写作: $$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \vec{p(t)} $$ #### 3D Parametric Lines 不多细说,跟 2D 情况类似。 ### 3D Parametric Surfaces 参数化方法可以用来定义 3D 空间中的平面,类似于我们如何定义曲线。在 3D 中平面的形式是: $$ x = f(u,v), y = g(u,v), z = h(u,v) $$ 或者,向量形式是: $$ \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \vec{p}(u,v) $$ 例如,一个在地球上的点可以用经度和纬度来描述。如果我们定义地球的原点就是地心的话,设 $r$ 是地球的半径,一个在原点球的坐标系就可以用来帮助我们表示 Parametric equations: $$ x = r \cos \phi \sin \theta, y = r \sin \phi \sin \theta, z = r\cos \theta $$ 我们也可以写成向量形式,但是这并不为这样特定的参数形式具备可行性。 我们想要对于一组给定的 $(x,y,z)$ 寻找一对 $(\theta, \phi)$。如果我们假设 $\phi \in (-\pi, \pi]$,这可以很轻松的用 $\arctan2$ 函数([atan2函数](https://zh.wikipedia.org/wiki/Atan2))来实现: $$ \theta = \arccos(z / \sqrt{x^2 + y^2 + z^2}), \phi = \arctan2(y,x) $$ 结合 Implicit surfaces,函数 $f$ 的微分给出了该平面的法向量,同时 $\vec{p}$ 的微分也告诉了我们该平面的几何信息。 考虑函数 $\vec{q}(t) = \vec{p}(t,v_0)$。这个函数定义了一个 Parametric curve ,通过变化 $u$ 在保持$v = v_0$ 不变的时候。这条曲线被称为在平面中的 Isoparametric curve (等参数曲线)。$\vec{q}$ 的微分给出了一个与曲线相切的向量。并且由于这条曲线在平面内,$\vec{q'}$ 也在平面内。因为这是通过变化 $\vec{p}$ 中的参数来得到的,所以 $\vec{q'}$ 是 $\vec{p}$ 关于 $u$ 的偏微分,我们记作 $\vec{p_u}$。类似的说法展示了偏微分 $\vec{p_u}$ 给出了等参数曲线的切线,对于常数 $u$。这也是平面的第二个相切向量。 由上,$\vec{p}$ 的微分给出了平面上任意一点的两个相切向量。平面的法线可以通过这些向量的叉积得到:因为他们二者都与平面相切,他们的叉积则与他们正交。这样就是平面的法线。右手系给出了一种方法哪一个是前面,或者说是外面,对于某一个平面。我们将用向量方便地表示: $$ \vec{n} = \vec{p_u} \times \vec{p_v} $$ 该法向量指向平面外方向。 ### Summary for Curves and Surfaces 2D 中的 Implicit curves 和 3D 中的 Implicit surfaces 用一个 scalar-valued (一个标量来衡量)的二元或者三元函数来表示:$f: \mathbb{R}^2 \to \mathbb{R}$ 或者 $f: \mathbb{R}^3 \to \mathbb{R}$ ,并且包含所有满足函数值为 $0$ 的点: $$ S = \{ \vec{p} | f(\vec{p}) = 0 \} $$ 2D 或者 3D 中的参数化曲线使用 vector-valued (一个矢量来衡量)的单变量函数来衡量:$\vec{p}: D \subset \mathbb{R} \to \mathbb{R}^2$ 或者 $\vec{p}: D \subset \mathbb{R} \to \mathbb{R}^3$ ,并且曲线扫过所有地方随着 $t$ 在整个 $D$ 上变化: $$ S = \{ \vec{p}(t) | t \in D \} $$ 3D 中的参数化平面也是用 vector-valued 的二元函数来表示的:$\vec{p}: D \subset \mathbb{R^2} \to \mathbb{R^3}$,该平面包括所有点 $(u,v)$ 在定义域内: $$ S = \{\vec{p}(t)| (u,v) \in D \} $$ 对于 Implicit curves 和 Implicit surfaces,法向量由 $f$ 的微分给出(即梯度)。相切向量(对于一条曲线)或者一组相切向量(对于一个平面)可以用法线的微分来构造一组基底。 对于参数化曲线和平面,$\vec{p}$ 的微分给出了相切向量(对于一条曲线)或者一组相切向量(对于一个平面),并且法向量可以通过构造一组基底从任何切线中得出。 最后修改:2024 年 04 月 26 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 4 如果觉得我的文章对你有用,请随意赞赏