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

157 阅读4分钟

Category:Higher Mathematics & Computer Graphics Application

正文

2.5 曲线和曲面(一)

曲线的几何形状,尤其是曲面,在图形中起着核心作用,在这里我们回顾了 2D 和 3D 空间中曲线和曲面的基础知识。

2.5.1 2D 隐式曲线

直观地说,曲线是可以在一张纸上绘制的一组点,而无需提起笔。描述曲线的常用方法是使用隐式方程。

二维的隐式方程具有以下形式:

image.png

函数 f(x, y) 返回一个实数值。该值为零的点 (x, y) 位于曲线上,值非零的点不在曲线上。例如,假设 f(x, y) 是:

image.png

其中 (xc, yc) 是二维点,r 是非零实数。如果我们取 f(x, y) = 0,则该等式成立的点位于以 (xc, yc) 为中心、半径为 r 的圆上。这被称为“隐式”方程的原因是曲线上的点(x,y)不能立即从方程中计算出来,而是必须通过求解方程来确定。因此,曲线上的点不是由方程明确生成的,而是隐含在方程中的某个地方。

有趣的是,f 确实具有所有 (x, y) 的值。我们可以将 f 视为一个地形,海平面为 f = 0(图 2.22)。岸是隐曲线。

image.png

f 的值是海拔高度。另一件需要注意的事情是,曲线将空间划分为 f > 0、f < 0 和 f = 0 的区域。因此,您可以评估 f 以确定一个点是否在曲线“内部”。请注意,f(x, y) = c 是任何常数 c 的曲线,而 c = 0 仅用作约定。例如,如果 f(x, y) = x2 y2 -1,改变 c 只会给出以原点为中心的各种圆(图 2.23)。

image.png

我们可以使用向量压缩我们的符号。如果我们有c =(xc,yc)和p =(x,y),则我们的中心C和半径为r的圆由满足的那些位置向量定义:

image.png

如果对这个方程进行代数扩展,将得到方程(2.9),但通过几何“阅读”方程更容易看出这是一个圆方程。

上面写着,“圆上的点 p 具有以下属性:从 c 到 p 的向量在点缀其自身时具有值 r2。”因为一个带有自身的向量只是它自己的长度的平方,我们也可以将等式解读为,“圆上的点 p 具有以下属性:从 c 到 p 的向量的长度为 r2 的平方。”

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

image.png

当然,这表明:

image.png

上面可以理解为“圆上的点 p 是距中心点 c 距离为 r 的点”,这与任何圆的定义一样好。这说明方程的向量形式通常比具有 x 和 y 的等价的成熟笛卡尔形式暗示更多的几何和直觉。因此,通常建议尽可能使用矢量形式。此外,您可以在代码中支持向量类;使用矢量形式时,代码更清晰。面向向量的方程在实现中也不太容易出错:一旦在代码中实现和调试向量类型,涉及 x、y 和 z 的剪切和粘贴错误就会消失。习惯这些方程中的向量需要一点时间,但是一旦你掌握了它,回报是巨大的。

2.5.2 2D渐变

如果我们将函数f(x,y)视为具有高度= f(x,y)的高度场,则梯度向量点朝着最大UPSLOPE的方向,即直上山。

梯度向量∇F(x,y)由:

image.png

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

在高度场的上下文中,偏导数和梯度的几何意义比平常更明显。假设在点 (a, b) 附近,f(x, y) 是一个平面(图 2.24)。

image.png

有一个特定的上坡和下坡方向。与该方向成直角的是相对于平面水平的方向。平面与 f(x, y)=0 平面之间的任何交点都将在水平方向上。因此上坡/下坡方向将垂直于交线 f(x, y)=0。要了解为什么偏导数与此有关,我们需要将其几何意义可视化。回想一下,一维函数 y = g(x) 的常规导数是:

image.png

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

image.png

偏导数是一维导数的推广。对于 2D 函数 f(x, y),我们不能对 x 采取与方程 (2.10) 中相同的限制,因为对于 x 的给定变化,f 可以以多种方式变化。但是,如果我们保持 y 不变,我们可以定义导数的类似物,称为偏导数(图 2.26):

image.png

image.png 为什么关于 x 和 y 的偏导数是梯度向量的分量?再一次,几何学比代数有更明显的洞察力。在图 2.27 中,我们看到向量 a 沿着 f 不变的路径传播。请注意,这又是在一个足够小的尺度上,表面高度 (x, y) = f(x, y) 可以被认为是局部平面的。从图中,我们看到向量 a = (Δx, Δy)。

image.png

因为上坡方向垂直于a,所以我们知道点积等于0:

image.png

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

image.png

给定垂直于垂直的任何向量(x,y)和(x', y'),我们知道它们之间的角度为90度,因此它们的点产物等于零(回想一下点产物与余弦成正比两个向量之间的角度)。因此,我们的xx'+yy' = 0。给定(x,y),构造有效的向量很容易(x,y)等于零,这两个最明显的是(y,-x)和(-y,x);您可以验证这些向量是否将所需的零点产物与(x,y)一起提供。该观察结果的概括是(x,y)垂直于k(y,-x),其中k是任何非零常数。这意味着这一点:

image.png

结合方程(2.11)和(2.12)给出:

image.png

其中k'是任何非零常数。根据定义,“上坡”意味着F的正变化,因此我们希望K'> 0,而K'= 1是一个很好的惯例。

作为梯度的一个例子,考虑带有梯度向量 (2x, 2y) 的隐式圆 x²+y²− 1 = 0,表明圆的外部是函数 f(x, y) = x² +y² − 1. 请注意,梯度向量的长度可以根据隐式方程中的乘数而有所不同。例如,对于任何非零 A,单位圆可以用 Ax²+ Ay² − A = 0 来描述。这条曲线的梯度是 (2Ax, 2Ay)。这将是圆的法线(垂直),但其长度由 A 确定。对于 A > 0,法线将指向圆外,对于 A < 0,它将指向内。

这种从外向内的转换是应该的,因为正区域在圆内转换。就高度场视图而言,h = Ax² +Ay²− A,圆的高度为零。当 A > 0 时,圆圈包围凹陷,而当 A < 0 时,圆圈包围凸起。随着 A 变得更负,凸起的高度增加,但 h = 0 圆没有改变。最大上坡方向不变,但坡度增大。坡度的长度反映了坡度的这种变化。如此直观地,您可以将坡度的方向视为上坡,将坡度的大小视为坡度的上坡程度。

隐式二维线

该行的熟悉的“斜率截距”形式是:

image.png

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

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

因为我们可以将一个隐式方程乘以任何常数而不改变它为零的点,所以对于任何非零 k,kf(x, y)=0 是相同的曲线。

这允许同一行有多个隐式形式,例如,

image.png

斜率截距形式有时很尴尬的一个原因是它不能表示某些线,例如 x = 0,因为 m 必须是无限的。出于这个原因,更一般的形式通常是有用的:

image.png 对于实数 A、B、C。

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

image.png

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

image.png

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

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

我们可以从垂直于 (x1−x0, y1−y0) 的任意 (A, B) 开始。根据与 2.5.2 节相同的推理,这样的向量就是 (A, B)=(y0 - y1, x1 - x0)。

这意味着通过 (x0, y0) 和 (x1, y1) 的直线方程为:

image.png

现在我们只需要找到 C。因为 (x0, y0) 和 (x1, y1) 在线,它们必须满足方程 (2.16)。我们可以将任一值插入并求解 C。对 (x0, y0) 执行此操作得到 C = x0y1 - x1y0,因此该线的完整方程为

image.png

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

image.png

隐式线方程的一个有趣特性是它可以用来找到从点到线的有符号距离。 Ax By C 的值与到直线的距离成正比(图 2.30)。如图2.31所示,一点到直线的距离就是向量k(A,B)的长度,即

image.png

image.png

image.png

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

image.png 该方程的简化是因为我们知道 (x, y) 在线上,所以 Ax By C = 0。从方程 (2.18) 和 (2.19),我们可以看到与直线的有符号距离Ax 通过 C = 0 到点 (a, b) 是

image.png

这里的“有符号距离”意味着它的大小(绝对值)是几何距离,但是在直线的一侧,距离是正的,而在另一侧,它们是负的。如果您的问题有某些理由更喜欢特定的一方是积极的,您可以在同样有效的表示 f(x, y)=0 和 -f(x, y)=0 之间进行选择。请注意,如果 (A, B) 是单位向量,则 f(a, b) 是有符号距离。我们可以将方程 (2.17) 乘以一个常数,以确保 (A, B) 是一个单位向量:

image.png

请注意,计算公式 (2.20) 中的 f(x, y) 直接给出有符号距离,但它确实需要平方根来建立等式。隐式线将对三角形光栅化非常有用(第 8.1.2 节)。第 14 章讨论了 2D 线的其他形式。

隐式二次曲线

在上一节中,我们看到线性函数 f(x, y) 产生隐式直线 f(x, y)=0。如果 f 是 x 和 y 的二次函数,则具有一般形式

image.png

生成的隐式曲线称为二次曲线。二维二次曲线包括椭圆和双曲线,以及抛物线、圆和直线的特例.

二次曲线的示例包括中心为 (xc, yc) 和半径为 r 的圆,

image.png

和轴对齐的椭圆形式:

image.png

其中 (xc, yc) 是椭圆的中心,a 和 b 是短半轴和长半轴(图 2.32)。

image.png

尝试在椭圆方程中设置 a=b=r 并与圆方程进行比较