【原创】《矩阵的史诗级玩法》连载十七:用矩阵研究二次贝塞尔曲线和抛物线的关系(上)

国庆节后上班第二天了,我还想继续把这教程给写下去,不然又得花一天时间酝酿情绪,太不划算了,还不如一气呵成。正好异形砖切割水刀拼花(不知道水刀拼花是什么的可以看连载十五)的需求也要用到这里的东西。

跟圆锥曲线相比,贝塞尔曲线在计算机绘图领域应用得更为广泛,所以对于我们来说,研究贝塞尔曲线比圆锥曲线要有意义多了。然而为什么我还要花这么大篇幅讲解圆锥曲线这么一个没卵用的东西呢?这是因为圆锥曲线是贝塞尔曲线的基础,而且圆在计算机工程设计中也经常被用到。

贝塞尔曲线的典型特点是“皮筋效应”,其强烈的物理性使得它的视觉冲击力强于圆锥曲线,所以它的方程设计也比圆锥曲线要特别得多,形状都由一个叫控制点的东西来决定。方程的形式为参数方程。

我不打算给大家讲解贝塞尔曲线的通用公式,在这问题上,我会点到即止,只把一次和二次的拿出来说一下。

贝塞尔曲线一次方程不包含控制点,只有起点和端点,方程如下:

其中t为参数,P0,P1为两个端点的坐标(x或y),B(t)为最终算出来的曲线上的点坐标。

看不习惯用点P表示的形式可以拆成x和y两条式子,不过它的形式最大的好处是可以轻松扩展到三维或以上。

拆分的写法如下:

当t=0时,x=x0,y=y0,当t=1时,x=x1,y=y1,所以(x0, y0)和(x1, y1)分别为一次贝塞尔曲线的两个端点。t从0到1变化的过程中,点(x, y)由(x0, y0)逐渐移动到(x1, y1)。这个规律在次数更高的贝塞尔曲线中仍然符合。

二次贝塞尔曲线的方程如下,不过端点是P0,P2而非P0,P1。

很多人看到这方程之后,直接就说它是抛物线,因为形式上真的就是,展开一下t的话就更像了。

由于P0,P1和P2都是给定点,所以可以用字母A,B,C来表示由这3个P常量所算出来的系数。

这样一看,它跟抛物线方程

真的没什么两样,只是变量的字母不一样而已,然而这个字母的不同,引起的差异可大了。贝塞尔曲线中,B(t)表示坐标(包含x和y),而t则为参数,它跟坐标值没有直接关系。但抛物线方程的y和x均为坐标值,所以说它们只是形式上相同,但变量的意义却相距甚远。

然后还有的人说,多项式一次函数是直线,二次函数是抛物线,然后贝塞尔曲线一次为直线,二次就该类推为抛物线了。类推倒是没错,但那只是个猜测,不能作为判断依据。

再者,二次贝塞尔曲线跟一次一样,本质都是拆成x和y的,如下所示

这样的话,哪怕展开t也跟抛物线完全不一样了。

所以,我们要消去t,化成仅包含x和y的方程才能跟抛物线作比较,然而这个去掉的过程过于繁琐,加上消元过程会产生根号,并且产生xy项,再加上某些二次贝塞尔曲线的样子我很难想象得到它是抛物线,以前还没接触矩阵的我,自然就直接否定了这一结论。

前面说过,包含xy项的二元二次方程可能是抛物线旋转的结果,那这样看来,二次贝塞尔曲线还真有可能可以通过旋转变成标准的抛物线。然后再看下上面的图,旋转一下没准就是一条抛物线。

有了理论支持,幻觉开始产生了,形状似乎还真是这么回事。

虽然现在观察到二次贝塞尔曲线有可能是抛物线,但心里仍然不踏实,两个无特殊化简方式的二元二次方程,消元需要开方,其过程不是一般的蛋疼。很长一段时间我缺乏演算它的动力,现在看表面现象虽然有点心动了,但行动起来还是差了那么一点点勇气,所以我一开始不用一般式,而是先拿个数字简单的来试试水,看下抛物线和二次贝塞尔曲线能否吻合,不能的话就说明存在反例,没必要再算下去了。

我们拿最简单的抛物线y=x^2来测试,然后取(-1,1)和(1,1)作为端点,接着过这两点作切线,其交点就是“控制点”。

如上图,“控制点”的坐标等于(0, -1)(这个值是怎么的出来的?请大家自己思考),然后3个点都取齐了,不过它是从抛物线上取出来的,我们要拿这3个点构建一条二次贝塞尔曲线,看最终结果是否刚好为y=x^2。

前面说到,二次贝塞尔曲线的方程如下:

在这个案例中,x0=-1,y0=1,x1=0,y1=-1,x2=1,y2=1,我们代入看看。

x部分为一次方程,可以从中解出t并代入到y部分。

卧槽,还真的是诶,如此惊人的吻合,让我瞬间有动力去演算一般的通式了。

PS:对数字敏感或者读书时候刷题刷多了的童鞋可能一眼就能对y部分进行因式分解得到

虽然说有动力推导一般式了,但这是个很痛苦的过程,就还是开一篇新的来写吧。这篇就到这里,我们下一篇再见!

猜你喜欢

转载自blog.csdn.net/iloveas2014/article/details/82977320