您链接到的图像是不使用二次曲线的例子,所以我要运行 与图像,而不是代码。
下面的ios(和os x)上的bezier路径基本上是一个绘图命令和点的列表。例如:在
[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)控制退出前一点的曲线的方向和速率,第二个cp控制曲线点的方向和速率。对于二次曲线(使用addQuadCurveToPoint:controlPoint:得到的结果),这两个点都是相同的,正如您可以在方法here的文档中看到的那样。
沿着一系列点获得平滑曲线涉及使cp1和cp2彼此共线,并且该线与该段两端的点平行。
这看起来是这样的:
[path moveTo:2];
[path curveTo:3 controlPoint1:cp1 controlPoint2:cp2];
CP1和CP2可以通过选择一些固定的线路长度,并做一些几何计算(我忘了我所有的线方程,但现在他们”
要使用# - >#来指定段和# - >#(cp#)来指定该段曲线调用的控制点。
下一个问题是使曲线从2-> 3段进入3-> 4段平滑。在你的代码的这一点上,你应该有一个控制点计算2-> 3(cp2)。给定你以前的恒定线长度(这将控制你得到的曲线的尖锐程度),你可以通过在图中得到2-> 3(cp2)和点3的共线点来计算cp1为3> 4。然后计算3-> 4(cp2),它与3-> 4(cp1)共线并平行于点3和点4形成的线。冲洗并重复您的点数组。
沉默是如此之大,它伤害。 – akaru
你想让曲线精确地穿过你的每个给定点吗?或者你想要一条更平滑的曲线可以通过一些给定的点? –
@robmayoff如果这是一个简单得多的操作,我认为close是够好的。 – akaru