《Fundamentals of Computer Graphics》翻译(三):隐式2D直线

本文是《Fundamentals of Computer Graphics》第二章2.5节的部分翻译。

隐式2D直线

我们熟悉的表示直线的“斜截式”的格式如下:
y = mx+b.
很容易把它转换成隐式格式(如图2.28):
y − mx − b = 0.

这里,m表示“斜率”(上升的比率),b是直线与y坐标相交的点的y值,通常称为y截距。

有时候斜截式显得很笨拙,其中一个原因是它无法比奥斯如x=0这样的直线,因为此时m必须是无穷大。因此,更普遍的格式通常是:
Ax + By + C = 0,

假如我们知道线上的两点,(x0,y0) and (x1,y1)。A,B,C取什么值才能描述穿过这两点的直线呢?因为这些点在直线上,他们必须同时满足:
Ax0 + By0 + C = 0,
Ax1 + By1 + C = 0.

不幸的是,我们只有两个方程,但有三个未知数:A,B, and C. 这是由隐式方程的任意性引起的。为了方便,我们可以设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.5.2节讨论的,梯度。对于直线 Ax + By + C = 0,梯度向量是(A, B)。该向量垂直于直线(如图2.29),并指向Ax + By + C为正的方向。在直线上取(x0 , y0 ) and (x1 , y1 )两点,我们知道在两点间的向量与该直线有相同的方向。该向量刚好为(x1 − x0 , y1 − y0 ),因为它平行于直线,因此它也垂直于梯度向量(A, B)。回忆刚才所说的,有无数对 (A, B, C)值可以描述该直线,我们可以选择任意一对(A, B, C)的值。


5994163-c2c51a6ee3084422.png

我们可以选择任意(A,B)向量垂直于(x1−x0,y1−y0)。例如(A, B) = (y0 − y1, x1 − x0) 。因此穿过 (x0 , y0 ) and (x1 , y1 ) 直线的方程可以写成
(y0 −y1)x+(x1 −x0)y+C =0. (2.16)

现在我们只需要找到C的值。因为 (x0,y0) and (x1,y1)在直线上,他们必须满足(2.16)。我们可以代入其中一点来求解C。如对于点 (x0, y0),C = x0y1 − x1y0,因此该直线的完整方程如下
(y0 −y1)x+(x1 −x0)y+x0y1 −x1y0 =0. (2.17)

再次强调,这是穿过两点的直线的无数隐式方程之一,但这种形式没有除法操作,因此在笛卡尔坐标上的点没有数值退化问题。方程2.17的一个好处是可以转化为斜截式:


5994163-e52375df002fffcf.png

隐式方程的一个有趣的性质是,可以用它来求出一点到直线的有向距离。Ax + By + C的值和它到直线f(x, y) = 0的距离成比例。(如图2.30)。正如图2.31,一个点到f(x, y) = 0直线的距离是向量 k(A, B)的长度,如下

5994163-8fd1f18ebf1495c1.png

5994163-effb1d26e788f5a1.png

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


5994163-a06e994c945a5d04.png

我们知道 (x, y) 在直线上,因此Ax + By + C = 0。从2.18和2.19式,我们可以看到点(a,b) 到直线Ax + By + C = 0的有向距离为


5994163-9b79e2a1e1bcbe44.png

这里“有向距离”的意思是他的数值(绝对值)是几何距离,但它在直线的某一侧,有向距离为正是在一侧,为负是在另一侧。注意如果(A, B)是单位向量,那么f (a, b)就是有向距离。我们可以对式2.17乘以一个常数,以保证(A, B)是单位向量:


5994163-d4ac71bd781b00a1.png

猜你喜欢

转载自blog.csdn.net/weixin_33739646/article/details/87427912