【原创】《矩阵的史诗级玩法》连载二十六:两条贝塞尔曲线的矩阵求交方法

上篇的结尾,我说传统法找到了灵感来简化,然而今天我才发现那个简化的思路是错的,既然如此,那我就不写简化的了,直接给出矩阵求解的方法。大家将会发现,即使不存在简单的直线方程,即使没有空子可钻,矩阵大法依然可以迎刃而解。

在连载二十一中,我们求出了贝塞尔曲线到抛物线的基向量转换矩阵,并且将这个矩阵应用到直线上,然后用变换后的直线和标准抛物线Y=X^2联立求解算出最终的交点。由于贝塞尔曲线被简化为最简单的二次函数Y=X^2,而直线方程经过基向量矩阵变换后仍然很简单,所以演算起来非常顺畅。

那么问题来了,如果把连载二十一中的直线换成贝塞尔曲线,那么它的基向量矩阵变换结果是否还能跟直线一样简单?

废话少说,我们直奔主题。

把连载二十四中的两条贝塞尔曲线搬过来。由于基向量矩阵依赖于点的信息,所以除了搬方程,我们把端点和控制点都拿过来。

第一条曲线的3个关键点分别为:(-1, -1),(2, 2),(1, -0.5),

第二条曲线的3个关键点分别为:(3, 0.5),(-3, 2),(2, -1)。

然后就是方程。

我们求出任意一条(比如第一条)贝塞尔曲线的基向量矩阵。求解过程我就不再搬过来了,可以参考连载二十一,此处直接给出结果。

这个推导过程非常简单,关键还能在高级语言里逐步实现,无需手算。

也就是说,变换后的X,Y和变换前的x,y存在如下关系。

这是第一条贝塞尔曲线的基向量变换矩阵,因此第一条曲线的方程一定是

接下来,我们要把这个基向量变换矩阵应用到另一条贝塞尔曲线上了。

然后把上面的Y=X^2代入,得到

这下要把X消掉,就很蛋疼了,虽然在连载二十一那里,我们也遇到了类似的式子,但当时贝塞尔曲线只有一条,经过矩阵变换后一定是Y=X^2,但这次我们就真的真的逃不掉了。那这是不是意味着,矩阵大法也要挂掉了呢?

答案当然是否定的,不然我也不会写下去。实际上,这里我们还有空子可钻。现在我们是拿了贝塞尔曲线的展开式来代入的,几何意义已经比较模糊,变换的时候只能采取纯数学的处理方法。但如果回到贝塞尔曲线最初的给定条件——三个已知点的话,事情就会变得简单很多。我们只要对这3个点应用基向量矩阵的变换,然后把变换后的点代入到贝塞尔曲线的方程中,就相当于对贝塞尔曲线做了一次基向量矩阵的变换了。

如果这段话你们听得比较懵逼,那就可以重温连载十九的内容。一句话总结下来,就是将曲线方程的变换问题转化为点的变换问题。而后者无论是从数学上还是编程上来看都远比前者简单得多。

我们把第二条曲线的3个点搬过来:

(3, 0.5),(-3, 2),(2, -1)

然后利用上面的关系式

进行变换。

这个公式实现的是已知X,Y的情况下算出x,y,而给定的三个点是变换前的,也就是x,y,所以需要反推出来。如果大家已经熟悉了本系列教程的套路,那相信你们能马上反应出来,这地方用基向量矩阵的逆矩阵即可完成逆推。

逆矩阵公式前面已经给出,并且包含了代码实现,所以我们可以把这事情交给计算机来完成。

逆矩阵的代码如下:

var matrix = new Matrix(1, 0.25, -1, -1.375, 1, 0.625);
matrix.invert();
console.log(matrix.a, matrix.b, matrix.c, matrix.d, matrix.tx, matrix.ty);

在确保引用了我前面给出的矩阵类代码的情况下,运行即可得到逆矩阵的结果为

然后利用matrix.transformPoint的方法分别对(3, 0.5),(-3, 2),(2, -1)这3个点进行变换,得到的结果为:(3.44, 1.44), (-6.11, -2.11), (2.67, 1.67)。

接着我们再拿这3个点构建贝塞尔曲线的方程,得到:

接下来,我们要见证最有爱的一刻了!把第一条方程,即Y=X^2代入上式

然后,我们只要对以上方程组的第一条方程的两边进行平方。

就可以很轻松地把X给消掉,只剩下一条关于t的一元四次方程了!

这条方程不带任何根号,只要用完全平方式把左边展开一下,然后合并同类项,就能代入到一元四次方程的求根公式中进行计算了。

说到这里,可能有的朋友表示不服,我只是在文中免去了很多琐碎的演算过程而已,实际上并没简化多少。此处我给解释一下。真相是,我自己都没去演算,而是都运用前面封装好的矩阵类,由代码帮我算好再写上博客的。跟传统做法相比,矩阵法可以把更多的工作交给计算机去做,并且这些工作比传统法的手算工作还要简单。

下一篇,我会放出矩阵法计算两条贝塞尔曲线交点的代码,敬请期待!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值