1. 主页
  2. 文档
  3. 计算机图形学基础教程
  4. 计算机图形学基础 数学杂项
  5. 曲线和曲面

曲线和曲面

曲线的几何形状,特别是曲面,在图形学中起着核心作用。这里,我们回顾一下二维和三维空间中的曲线和曲面的基本知识。

二维隐式曲线

直观地说,曲线是一组不用提笔就能在纸上画出来的点。一个常见的描述曲线的方法是使用隐式方程。一个二维的隐式方程的形式为

f (x, y) = 0

函数f (x, y)返回一个实数。该值为零的点(x, y)在 曲线上,而数值为非零的点则不在曲线上。例如,我们说 f (x, y) 是

f(x, y) = $(x − x_c)^2 + (y − y_c)^2 − r^2,(2.9)

其中$(x_c,y_c)$是一个二维点,r是一个非零实数。如果我们把f (x, y) = 0,这个等式成立的点就在圆心$(x_c,y_c)$和半径r的圆上。这被称为 “隐含 “方程的原因是曲线上的点(x, y)不能立即从方程中计算出来,而必须通过解方程来确定。因此,曲线上的点不是由方程明确产生的,而是隐含在方程中的某个地方。

值得注意的是,f对所有(x, y)都有值。我们可以把f想象成一个地形,海平面f = 0(图2.24)。海岸是隐式曲线。f的值是高度。另一件需要注意的事情是曲线将空间划分为f > 0, f < 0和f = 0的区域。所以你对f求值来决定一个点是否在曲线内。注意f (x, y) = c是任意常数c的曲线,而c = 0只是一种惯例。例如,如果f (x, y) = $x^2 + y^2 – 1$,改变c只会给出以原点为中心的各种圆(图2.25)。

我们可以用向量来压缩我们的符号。如果我们有c = ($x_c ,y_c $) 和 p = (x, y) , 那么我们以c为中心、以r为半径的圆是由那些满足以下条件的位置向量定义的

(p − c) ⋅ (p − c) − $r^2$ = 0

这个方程,如果用代数法展开,将得到方程(2.9),但从几何角度 “阅读 “这个方程,更容易看出这是一个圆的方程。它的内容是:圆上的点p具有以下性质:点c到p的向量本身的值是$r^2$ “因为向量点乘自身等于自身长度的平方,我们也可以把方程理解为,“圆上的点p具有以下性质:从c到p的向量的长度是$r^2$的平方”

图2.24。一个隐函数f(x,y) = 0可以被认为是一个高度域,其中f是高度(顶部)。一条高度为0的路径是隐式曲线(底部)。

图2.25. 隐性函数为任何常数定义了一条曲线,零是通常的惯例。

甚至更好的是,观察到长度的平方只是从c到p的距离的平方,这表明了等价的形式

$∥p − c∥^2 − r^2$ = 0,

当然,这也表明

∥p − c∥ − r = 0

上面的定义可以这样理解:“圆上的点p与圆心c之间的距离为r”,这是对圆的一个很好的定义。这说明,向量形式的方程通常比等价的完整的笛卡尔形式(包含x和y)更具有几何和直觉性。因此,在可能的情况下,通常建议使用向量形式。此外,你可以在你的代码中支持一个向量类;当使用vector形式时,代码更清晰。面向向量的方程在实现中也不容易出错:一旦在代码中实现和调试向量类型,涉及x、y和z的剪切和粘贴错误就会消失。这需要一段时间来适应这些方程中的向量,但是一旦你掌握了它,回报是巨大的。

二维梯度

如果我们把函数f (x, y)看作是一个高度场,height=f (x, y),那么梯度向量就会指向最大的上坡方向,也就是直上坡。梯度向量∇f(x, y)由以下公式给出

$f (x, y) = ( \frac{∂f}{∂x} , \frac{∂f}{∂y} )$

梯度向量在隐式曲线f (x, y) = 0上一点的值垂直于曲线在该点处的切向量。这个垂直向量通常称为曲线的法向量。另外,由于梯度点是上坡的,它表示了f (x, y) > 0区域的方向

图2.26. 一个height=f(x,y)的表面在(x,y)=(a,b)附近是局部平面。坡度是上坡方向对height=0平面的投影。

在高度场的背景下,偏导和梯度的几何意义比平时更明显。假设在点(a,b)附近,f(x,y)是一个平面(图2.26)。有一个特定的上坡和下坡方向。与这个方向成直角的是一个相对于平面而言的水平方向。该平面与f(x,y)=0平面之间的任何交点都将位于水平方向。因此,上坡/下坡方向将与交线f (x, y) = 0垂直。要知道为什么偏导与此有关,我们需要直观地了解其几何意义。回顾一下,一维函数y=g(x)的常规导数是

$\frac{dy}{dx} ≡ \lim \limits_{Δx \to 0} \frac{Δx}{Δy} = \lim \limits_{Δx \to 0} \frac{g(x+Δx)−g(x)}{Δx}$  (2.10)

这测量了切线到g的斜率(图2.27)。

图2.27. 一维函数的导数测量的是与曲线相切的直线的斜率。

偏导是一维导数的一般化。对于一个二维函数f (x, y),我们不能像方程(2.10)中那样对x进行限制,因为对于x的给定变化,f可以有很多变化。然而,如果我们保持y不变,我们可以定义一个类似的导数,称为偏导(图2.28)。

$\frac{∂f}{∂x} ≡ \lim \limits_{Δx \to 0}\frac{f(x+Δx,y)−f(x,y)}{Δx}$

为什么关于x和y的偏导数是梯度向量的组成部分?在图2.29中,我们看到向量a沿着f不改变的路径移动。请注意,这又是在一个足够小的尺度上,表面height(x,y)=f(x,y)可以被视为局部平面。从图中,我们看到向量a = (Δx, Δy) 。
因为上坡方向与a垂直,我们知道点积等于零。

(∇f) ⋅ a ≡ (x∇, y∇) ⋅ (xa, ya) = x∇Δx + y∇Δy = 0. (2.11)

图2.28. 函数f相对于x的偏导必须保持y不变才有唯一的值,如黑点所示。空心点表示f的其他值,这些值不保持y不变。

我们还知道f在(xa,ya)方向上的变化量为0:

给出任何垂直的向量(x,y)和(x,y),我们知道它们之间的角度是90度,因此,它们的点积等于0(记得点积与两个向量之间的角度的余弦成正比)。因此,我们有 xx + yy =0。给定(x, y),很容易构造出与(x, y)的点积等于零的有效向量,最明显的两个是(y,-x)和(-y, x);你可以验证这些向量与(x, y)的点积为零。对这一观察的概括是,(x, y)垂直于k(y,-x),其中k是任何非零常数。这意味着

(xa, ya) = k($\frac{∂f}{∂y},\frac{∂f}{∂x}$). (2.12)

图2.29. 向量a指向f没有变化的方向,因此与梯度向量∇f垂直。

结合式(2.11)和式(2.12)可得

(x∇, y∇) = k’($\frac{∂f}{∂x},\frac{∂f}{∂y}$)

其中k是任何非零常数。根据定义,”上坡 “意味着f的正向变化,所以我们希望k>0,而k=1是一个非常好的约定。

作为梯度的一个例子,考虑圆的隐式方程$x^2 + y^2$ – 1 = 0,梯度向量(2x,2y),表明圆的外面是函数f(x,y)=$x^2 + y^2$ – 1的正区域。请注意,梯度向量的长度可以根据隐式方程中的乘数而不同。例如,对于任何非零的A,单位圆可以用A$x^2 + Ay^2$ – A = 0来描述,这个曲线的梯度是(2Ax,2Ay)。对于A>0,法线将指向圆的外侧,对于A<0,它将指向内侧。这种从外向到内向的切换是应该的,因为正区域在圆内切换。就高度场的观点而言,h=A$x^2+Ay^2$-A,圆的高度为零。对于A>0,圆包围着一个凹陷,对于A<0,圆包围着一个凸起。当A变得更负时,凸起的高度增加,但h=0的圆没有变化。最大上坡的方向没有变化,但坡度增加。坡度的长度反映了坡度的这种变化。因此,直观地讲,你可以认为坡度的方向是指向上坡的,其大小是衡量坡度的上坡程度。

隐式二维线

这条线就是我们熟悉的“斜截”形式

y = mx + b.    (2.13)

这可以很容易地转换为隐式形式(图2.30)

y − mx − b = 0.    (2.14)

这里,m是 “斜率”(增长率),b是直线与y轴相交的y值,通常称为y轴截距。这条线也划分了2D平面,但这里的“内”和“外”可能更直观地称为“上”和“下”

图2.30. 一条二维直线可以用方程y – mx – b = 0来描述。

因为我们可以将一个隐式方程乘以任意常数而不改变它为零的点,所以kf (x, y) = 0对于任何非零的k来说是同一条曲线,这允许同一条直线有几种隐式形式,例如,

2y − 2mx − 2b = 0.

斜截线的形式有时很别扭,原因之一是它不能表示某些直线,如x=0,因为m必须是无限的。出于这个原因,一个更一般的形式往往是有用的。

Ax + By + C = 0, (2.15)

对实数A,B,C。

假设我们知道线上的两个点 (x0, y0) 和 (x1,y1) 。 什么 A、B 和 C 描述了通过这两点的线? 因为这些点位于直线上,所以它们都必须满足公式 (2.15):

Ax0 + By0 + C = 0,
Ax1 + By1 + C = 0.

不幸的是,我们有两个方程和三个未知数。这个问题的出现是因为我们可以通过隐式方程获得任意的乘数。为了方便起见,我们可以设定C=1。

Ax + By + 1 = 0,

但我们有一个类似于斜率-截距形式的无限斜率情况的问题:经过原点的直线需要a (0) + B(0) + 1 = 0,这是矛盾的。例如,穿过原点的45°直线的方程可以写成x – y = 0,或者y – x = 0,甚至可以写成17y – 17x = 0,但不能写成Ax + By +1 = 0。

每当我们遇到这种讨厌的代数问题时,我们就会尝试用几何直觉作为指导来解决这些问题。正如第2.7.2节所讨论的,我们有一个工具,就是梯度。对于直线Ax + By + C = 0,梯度向量是(A,B)。这个向量垂直于直线(图2.31),并指向直线上Ax + By + C为正的一侧。给定直线上的两点(x0,y0)和(x1,y1),我们知道它们之间的向量与直线的方向相同。这个向量就是(x1-x0,y1-y0),因为它与直线平行,所以它也必须与梯度向量(A, B)垂直。回顾一下,由于内含的任意缩放特性,有无数个(A, B, C)可以描述这条线。我们希望任何一个有效的(A, B, C)。

图2.31. 梯度向量(A, B)垂直于隐式直线Ax + By + C = 0。

我们可以从垂直于(x1-x0,y1-y0)的任何(A,B)开始。这样的向量只是(A,B)=(y0-y1,x1-x0),推理与第2.7.2节相同。这意味着通过(x0,y0)和(x1,y1)的直线的方程是

(y0 − y1)x + (x1 − x0)y + C = 0. (2.16)

现在我们只需要找出c,因为(x0,y0)和(x1,y1)在直线上,它们必须满足式(2.16)。我们可以代入任意一个值来解出C,这样做得到(x0,y0) C= x0y1 – x1y0,因此,这条直线的完整方程是

(y0 − y1)x + (x1 − x0)y + x0y1 − x1y0 = 0 (2.17)

同样,这是通过两点的直线的无穷多个有效隐式方程之一,但这种形式没有除法运算,因此对于有限笛卡尔坐标下的点没有数值退化的情况。方程(2.17)的一个优点是,我们总是可以转换成斜截式(当它存在时),方法是将非y项移到等式右边,然后除以y项的乘数:

y = $\frac{y1−y0}{x1−x0} x +\frac{x1y0−x0y1}{x1−xc}$.

隐式直线方程的一个有趣的性质是,它可以用来计算点到直线的带符号距离。Ax + By + C的值与到直线的距离成正比(图2.32)。如图2.33所示,点到直线的距离为向量k(a, B)的长度,即

distance = k$\sqrt[]{A2 + B2}$. (2.18)

图2.32. 隐函数f (x,y) = Ax + By + C的值是一个常数乘以Ax + By + C = 0的符号距离。

对于点(x,y)+k(A,B),f(x,y)=Ax+By+C的值是

f (x + kA, y + kB) = Ax + k$A^2 + By + kB^2$ + C

= k($A^2 + B^2$).  (2.19)

图2.33. 向量k(A,B)将直线上的一个点(x,y)与不在直线上的一个点连接得最近。该距离与k成正比。

 

这篇文章对您有用吗? 2