你提供的图片示例并不使用二次贝塞尔曲线,因此我将参考该图片而非代码。
在 iOS(和 OS X)中,贝塞尔路径基本上是绘图命令和点的列表。例如:
[path moveTo:CGMakePoint(1,1)];
[path curveToPoint:(10,10) controPoint1:(3,7) controlPoint2:(4,1)];
[path curveToPoint:(10,10) controPoint1:(15,17) controlPoint2:(21,11)];
[path closePath];
结果为:
moveto (1,1)
curveto (10,10) (3,7) (4,1)
curveto (20,0) (15,17) (21,11)
closepath
贝塞尔曲线上的控制点控制了从某一点出发的曲线方向和速率。第一个控制点(cp)控制了从前一个点出发的曲线方向和速率,第二个控制点控制了到达的点的曲线方向和速率。对于二次曲线(使用addQuadCurveToPoint:controlPoint:得到的结果),这两个点是相同的,您可以在此方法的文档here中看到。
沿一组点得到平滑曲线的关键是使cp1和cp2共线,并且该线与该段两端的点平行。
![Annotated curve](https://i.imgur.com/Dpyqx.png)
这将看起来像:
[path moveTo:2];
[path curveTo:3 controlPoint1:cp1 controlPoint2:cp2];
通过选择一些恒定的线段长度并进行一些几何运算(我现在忘记了所有线性方程,但它们很容易在谷歌搜索中找到),可以计算出cp1和cp2。
在代码中进入2->3线段时,应该已经为2->3(cp2)计算了控制点。接下来要解决的问题是使曲线从2->3线段平滑地过渡到3->4线段。根据之前的恒定线段长度(这将控制您得到多么平滑的曲线),可以通过计算一个与图中点2->3(cp2)和点3共线的点来为3->4计算一个cp1。然后计算一个3->4(cp2),它与3->4(cp1)共线并且与点3和点4形成的直线平行。重复此过程直到遍历完整个点数组。