如何检测/处理弯曲区域的触摸事件?

我开始使用原生的iPad应用程序(如果需要,我们可以假设iOS 4.3+),我需要有一系列相互碰撞的弯曲区域。

一系列弯曲的区域堆叠在一起

我喜欢一些关于处理这个问题的最佳方法的build议。

我以为有一个想法是使用WebView,只有一个JPG和一个HTML图像映射,但我真的更喜欢使用某种支持曲线的原生UI元素。

任何build议?

我们有这样的问题。 为了解决这个问题,我们在Adobe Illustrator中创build了一个黑白面具。 你需要为每个你想要的区域做这个。

接下来,我们导出这个文件。 我不记得文件导出选项,但基本上你会得到一个文本文件,其中包含线路,贝塞尔曲线等path数据的负载。

然后,我们拿了这个文件,并写了一个import商parsing它,并创build一个CGPath。

最后阶段是容易的一点。 您从UITouch获取触点并执行CGPathContainsPoint调用。

这里有一些伪代码:

  1. 跳过行,直到我们find一个“1 XR”。 这是后续行中有意义的表示。

  2. 使用“”的分隔符将行分割成组件数组。

  3. 该行的最后一个组成部分是行动。 如果是“m”,则是path移动,如果是“C”,则是一条贝塞尔曲线,如果是“L”,则是一条线。

  4. 如果是“Y”或“V”,那么你需要获得上一行的组件并parsing,如下所示:

(a)元件数量包括动作,所以我们需要减less这个。 例如274.5600 463.6800 m(b)如果这条线有四个坐标,而前一个有两个坐标,那么它是一个贝塞尔节点的点节点。 你的贝塞尔曲线点如下所示:

  cp1x = previous line's components object at index 0 cp1y = previous line's components object at index 1 cp2x = this line's components object at index 0 cp2y = this line's components object at index 1 x = this line's components object at index 2 y = this line's components object at index 3 

(c)否则,如果该行有四个坐标,前一行有四个或六个坐标,则如下所示:

  cp1x = this line's components object at index 0 cp1y = this line's components object at index 1 cp2x = this line's components object at index 2 cp2y = this line's components object at index 3 x = this line's components object at index 2 y = this line's components object at index 3 

其中cp是“控制点”。 所以你有控制点一和控制点二与他们各自的x和y坐标。

创build每个表示单独区域的bezierpath(通过执行lineToPoint或类似的函数)。

 UIBezierPath *p1 = [UIBezierPath bezierPath]; [path1 lineToPoint:somePoint]; [pointArray1 addObject:NSStringFromCGPoint(somePoint)]; // create lots of points and close p1 path 

然后find一些凹形的三angular剖分algorithm,将每条贝塞尔path变成一个三angular形的数组(即,不是存储数组的贝塞尔path点坐标,你将存储三angular形的坐标数组(arrays的点阵)algorithm和解释可以在任何游戏开发论坛,甚至在堆栈交换的GameDev中find 。

重复每个区域的贝塞尔path创build和三angular剖分。

然后有这些数组只是一个简单的迭代问题来检查某些兴趣点是否在这些三angular形之一。

更新似乎@omz评论呈现我的答案没用,因此这只是一个问题,创build贝塞尔path和每个调用方法。)