gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 03:25:10 25 4
gpt4 key购买 nike

如何沿着特定的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com