iphone - 如何检测 UIBezierPath 上的触摸并沿着它移动球?

标签 iphone objective-c cocoa-touch

如何沿着特定的 UiBezierPath 移动球?这可能吗?

我已经尝试了所有方法,包括使用

-(BOOL)containsPoint:(CGPoint)point onPath:(UIBezierPath*)path inFillArea:(BOOL)inFill

如何检测路径上的触摸?

最佳答案

首先……这是一个绝对的事实:

绝对没有 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 分别调用一次。 希望对某人有帮助!

关于iphone - 如何检测 UIBezierPath 上的触摸并沿着它移动球?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4854035/

相关文章:

objective-c - 为一个类禁用 Objective-C 自动属性合成?

objective-c - 用于在墙上张贴的自定义控件(如在 Facebook 应用程序中)

iphone - 使用 eventkit 发送日历事件/邀请

ios - NSMutableArray 线程并发与 GCD

objective-c - NSDictionary 的 objectForKey 是否为 : rely on identity or equality?

iphone - 突出显示单个烛条的核心图

iphone - 没有 UIViewController 的 UITabBar 按钮

ios - 启动期间设备方向和 UIView 出现问题

ios - UITextField 的 UIToolbar 附件 View 无响应

ios - 优化 snmp 库以在 iphone 中搜索设备 ip 地址