首先......这是一个绝对的事实:
Apple 提供的绝对没有方法,
从 UIBezierPath 中提取点。
这是 2011 年 2 月的绝对事实,在最新的操作系统中,一切都即将到来。我已经与 Apple 的相关工程师讨论了这个问题。在许多游戏编程环境中这很烦人,但事实就是如此。那么,它可以回答你的问题吗?
第二点:不要忘记,沿着 UIBezierPath 制作动画就像馅饼一样简单。 SO上有很多答案,例如How can I animate the movement of a view or image along a curved path?
第三:关于找出触摸发生在哪里,如果这就是你要问的,正如 Cory 所说,这是一个难题!但是您可以使用 CGContextPathContainsPoint 来确定一个点(或触摸)是否在给定厚度的路径上。
之后,假设我们讨论的是三次方,您需要沿着贝塞尔曲线找到点和可能的速度(也称为切线)。
这是执行此操作的确切总代码: Find the tangent of a point on a cubic bezier curve (on an iPhone)。我也贴在下面了。
根据您的情况,您必须实施自己的 MCsim 或迭代才能找到它的目标。这并不难。
(第四——作为脚注,有一个新事物,您可以逐步绘制 bezpath,可能与您的问题无关,而只是一个注释。)
为了方便大家以后阅读,这里是两个“好用”例程的链接问题的总结...
最后,这里以最简单的方式是计算等距点(实际上,近似等距)和这些点的切线的两个例程,沿着贝塞尔三次:
CGFloat bezierPoint(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d)
{
CGFloat C1 = ( d - (3.0 * c) + (3.0 * b) - a );
CGFloat C2 = ( (3.0 * c) - (6.0 * b) + (3.0 * a) );
CGFloat C3 = ( (3.0 * b) - (3.0 * a) );
CGFloat C4 = ( a );
return ( C1*t*t*t + C2*t*t + C3*t + C4 );
}
CGFloat bezierTangent(CGFloat t, CGFloat a, CGFloat b, CGFloat c, CGFloat d)
{
CGFloat C1 = ( d - (3.0 * c) + (3.0 * b) - a );
CGFloat C2 = ( (3.0 * c) - (6.0 * b) + (3.0 * a) );
CGFloat C3 = ( (3.0 * b) - (3.0 * a) );
CGFloat C4 = ( a );
return ( ( 3.0 * C1 * t* t ) + ( 2.0 * C2 * t ) + C3 );
}
四个预先计算的值,C1 C2 C3 C4,有时被称为贝塞尔系数。 (回想一下,a b c d 通常被称为四个控制点。)当然,t 从 0 到 1,例如每 0.05 一次。 只需为 X 调用一次这些例程,为 Y 分别调用一次。
希望它可以帮助某人!