接上一篇「曲线插值:大直若曲」。算法
当我生活在一条多项式曲线 $P(t)$ 构造的空间里,要让我感觉到这个空间是弯曲的,须要给我一个测量工具,让我可以测量这个空间里任意两个 $t$ 值 $t_a$ 与 $t_b$ 对应的两个点 $P_a$、$P_b$ 之间的距离,即 $d(P_a, P_b)$。为了便于描述,我给 $t$ 取了个名字,叫时间。segmentfault
假设这个空间是平直的,我拿着始终朝一个方向前进,那么在任何一段时间 $\Delta t = t_b - t_a$ 里,我走过的距离应该是相等的。我将这种运动称为匀速直线运动。工具
我开始作这个实验,足迹几乎踏遍了整个世界。结果让我很吃惊,在相同的 $\Delta t$ 里,常常性地出现走过的距离不相等的状况。在你看来,这是个很简单的现象,由于随着曲线的弯曲,相同的 $\Delta t$ 对应的曲线弧长不尽相同,在曲率较大的区域,弧长会比平直区域增大不少。然而,这个现象却足以让我怀疑人生了。spa
若是我有大家的那个世界里的爱因斯坦的头脑,我必定会认为个人空间在膨胀或收缩,时间变快了或变慢了……然而在你看来,我所谓的时间变快或变慢,只是空间弯曲给我形成的一种错觉。blog
我一直觉得本身是匀速运动,而在你看来,我时而加速,时而减速……不然你没法解释,为何我在一样的 $\Delta t$ 里走过的长度不相等。在我看来,这实际上是你的错觉,是个人时间变快或变慢给你形成了个人行走过程当中存在着加速与减速。get
看来,咱们都要时不时地怀疑一下本身的人生了。it
有一种曲线,叫作圆。从理论上说,我在这样的曲线里行走,感觉应当与在一条直线里行走同样。class
不过,在我看来,这个理论是没法成立的。若是是一个整圆,那么我在向一个方向行走的过程,能够经过是否可以回到起点来判断。若是是一个半圆,那么从理论上来讲,个人确会误认为它是直线。然而,这种事不可能会发生,由于多项式曲线永远没法精确地表示圆。渲染
如今假设二维空间中有三个点 $P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$。显然,这三个点位于单位圆上,确切的说是半个单位圆。假设这三个点对应的 $t$ 值分别为 -一、0、1,那么使用 Neville 算法对这三个点进行插值,结果获得的不是半圆,而是弧长比半圆要小一些的二次曲线——抛物线,以下图所示:im
因为 POV-Ray 仅能渲染三维图形,所以为了绘制这条曲线,我在作曲线插值时,为这三个点进行了升维变换,即给它们增长了一个维度,将它们变成 $P_0 = (-1, 0, 0)$、$P_1 = (0, 1, 0)$、$P_2 = (1, 0, 0)$。
你认真思考了一下为何我会走这样的路径,很快你会发现,是我走的太快了。当我以恒定的「光速」在二次的曲线空间中行走时,这就是我走出来的最短路径。怪我咯!走得太快也有错吗?
你须要想出一种办法来限制个人速度,让我在某些控制点处的速度可以变得慢一些。然而,你有能力给我制造曲线空间,却没有能力控制个人速度。因而,你只能故伎重演,给我制造了一个新的曲线空间,让我在这个空间里以光的速度奔跑,而我在原曲线所在的空间里投下的影子则时而快时而慢地欢快奔跑。
新的曲线所在的空间,其维度一定大于二维(不要忘记,上文是在二维空间里讨论曲线插值问题)。这是由于,在二维空间里,过三个点有且仅有一条二次插值曲线,企图不增长空间维度,而在原空间中改变个人影子的速度,是徒劳的。
从新来看上述的三个点,$P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$,它们到原点的距离都是 1。这是由于它们的坐标要符合单位圆的定义,即 $x^2 + y^2 = 1$。然而这个定义只是描述了两个正交的一维平直空间的关系,而未能描述这分别位于两个空间中的点 x 与 y 的运动。要描述运动,须要时间。通过一番思索,你发现能够像下面这样给出单位圆定义的等价描述:
$$ \begin{aligned} x(t) & = \frac{2t}{1 + t^2} \\ y(t) & = \frac{1-t^2}{1 + t^2} \end{aligned} $$
这样,当 $t$ 发生变化时,两个一维点的运动轨迹,在二维空间里便「合成」了你因此为的半圆。
这时,你发现,这两个一维点的运动轨迹方程的右侧的分式,分母是相同的,都是 $1+t^2$。若是移走这个分母,那么剩下的分子便造成了单项式与多项式——这是咱们都喜欢的。
移走分母的办法很简单,方程两边都乘以分母,结果就获得了
$$ \begin{aligned} (1 + t^2)x(t) & = 2t \\ (1 + t^2)y(t) & = 1-t^2 \\ \end{aligned} $$
可是左边绑着这么一个东西也不是事,干脆就把它割下来,做为 $z(t)$,因而就获得了
$$ \begin{aligned} x(t) & = 2t \\ y(t) & = 1-t^2 \\ z(t) & = 1 + t^2 \end{aligned} $$
你发现,这样作不只成功地将二维点变成了三维点,并且只要将 $x(t)$ 与 $y(t)$ 分别除以 $z(t)$,就能够从新获得原来的 $x(t)$ 与 $y(t)$,相似于将一个三维点投影到了二维空间,并且刚好落在半圆上。
你发现,这样作不只成功地将二维点变成了三维点,并且只要将 $x(t)$ 与 $y(t)$ 分别除以 $z(t)$,就能够从新获得原来的 $x(t)$ 与 $y(t)$,相似于将一个三维点投影到了二维空间,并且刚好落在半圆上。
你对我说,这样作是否是很神奇?我无语,由于在我看来,一切都没变,它们都是单项式或多项式曲线。你以为这就是神奇之处,一些看上去使用多项式没法精确表示的曲线,却能够在一个维度更高的空间里造成一条多项式曲线。
你用上述手法,分别用 -一、0、1 做为 $P_0 = (-1, 0)$、$P_1 = (0, 1)$、$P_2 = (1, 0)$ 对应的 $t$ 值,即可以将着三个点变换为三维空间中的点,即 $P'_0 = (-2, 0, 2)$、$P'_1 = (0, 1, 1)$、$P'_2 = (2, 0, 2)$。
如今,假设你只是生活在二维空间中的生物,第三个维度对你而言,只是你想象出来的一个维度,它在你的世界里没有任何物理意义,也就是说,这个 $z(t)$ 的量纲与 $x(t)$ 和 $x(t)$ 毫无关系,而它又好像是你的这个世界里一个固有属性。因而,你给它取了个名字,叫作质量,用符号 $m$ 来表示它,又将带质量的点称为质点,用 $(x, y, m)$ 来表示。
每一个维度的人都有着在更高维度空间里的人看来很好笑的思惟局限。
如今,你决定先不考虑质量的本质到底是什么这个问题了,你想尝试的是,对 $t$ 直分别为 -一、0、1 的 $P'_0 = (-2, 0, 2)$、$P'_1 = (0, 1, 1)$、$P'_2 = (2, 0, 2)$ 使用 Neville 算法进行 2 次多项式曲线插值,结果能够获得
将上述曲线投影到二维空间——曲线上全部点的各维坐标除以质量(第三维坐标),就能够获得半圆:
实际上获得的是位于 z = 1 平面上的半圆。由于 $(x, y, m)$ 的各维坐标除以质量,获得的是 $(\frac{x}{m}, \frac{y}{m}, 1)$,也就是质量为 1 的点。
很魔性,对吧?
想不想知道这两条曲线的关系?看下面这张图:
上面那条曲线,即是三维空间中的一条抛物线,下面那条曲线即是那条抛物线在 $z = 1$ 平面上的投影——半圆。最下面的那个点是原点 $O(0,0,0)$。蓝色的线是投影线。这实际上即是所谓的投射投影,原点为灭点。可是,大家的世界里,有一些人给它起了个更使人敬畏的名字,即奇点,并认为大家的整个宇宙是从这个点爆炸出来的,并且这个爆炸的过程还在继续……更可怕的是,大家认为这个点的质量无限大。
像圆、椭圆、双曲线之类的曲线被称为有理曲线——不是由于它们颇有理,而是讲究理性的古人发现了它们。要用多项式曲线精确表示有理曲线,咱们须要构造三个空间。多项式曲线所在的空间叫作仿射空间。有质点的那个空间叫格拉斯曼空间。有理曲线所在的空间叫射影空间。
关于这三个空间的关系,之后有时间我会再写一篇文章。