曲线这部分基本上就单讲了贝塞尔曲线
目录
贝塞尔曲线(Bezier curves)
De Casteljau’s algorithm
B-splines
贝塞尔曲线(Bezier curves)
很早之前说过的这种矢量图是不会随着放大而失真的,像这种字体,就是用了逐段的三次贝塞尔曲线实现的
比方说有这四个控制点p0、p1、p2和p3,那么贝塞尔曲线的起点就是p0,终点就是p3,而且在起点的切线t0方向就是p0p1,在终点的切线t1方向就是p2p3,实际上切线的大小也是确定的,这个到后面讲这个贝塞尔曲线怎么画就知道怎么来的了
De Casteljau’s algorithm
这个De Casteljau’s algorithm就是讲这个贝塞尔曲线怎么画的,先考虑简单的三个控制点的怎么画,即二次贝塞尔曲线
假设我们画完这个贝塞尔曲线需要一个时间,这个时间长度为1,那么我们需要确定的是每个时间t,这个贝塞尔曲线会画出的点在哪里
我们再次使用这个线性插值,对于时间t,先在第一条线段b0b1中找出比值为t/1的点
然后在第二条线段b1b2中找出比值为t/1的点
然后把找出的两个连起来形成一条新线段,在这个新线段中继续寻找比值为t/1的点,这个点就是贝塞尔曲线在时间t时画出的点
依次枚举出每个时间t的点就可以画出贝塞尔曲线
同理如果是四个控制点,递归的思想解决问题,一轮可以减少一个控制点
Hackery, Math & Design — Acko.net
实际上可以通过数学的方式写出来
实际上是通过Bernstein多项式求和
因此可以计算出三次贝塞尔曲线的切线大小,即四个控制点
并且仿射变换前后画出的贝塞尔曲线是一样的
贝塞尔曲线不会超过控制点所形成的凸包,所谓凸包,就控制点能够框起来的范围
当控制点非常多的时候,贝塞尔曲线无法很好的描述这个变化的曲线
因此出现了逐段的贝塞尔曲线,即将每四个点画一段贝塞尔曲线
但是这样每段之间会出现一个曲折,解决办法是让上一段在终点的切线和下一段在起点的切线大小相等方向相反
C0连续:函数值连续,即线连起来不断,C代表continuity
C1连续: 一阶导数连续
B-splines
这个样条Spline是非常复杂的东西,简单来说就是通过一组给定点并具有一定数量连续导数的连续曲线
这个B样条就是basis Spline的简称, 这个B样条是什么呢?对于一条曲线,我们不希望改变某个控制点就会影响到整一条曲线,即希望曲线具有局部性,我改动一个点就只会影响一部分,就像我们前面说的这个逐段的贝塞尔曲线,这就是一种B样条