在 iPhone 游戏中检查绘制的路径/CGPath 是否相交。

4

我在OpenGL ES中绘制了一条路径。如果需要,我可以将其转换为CGPath。

如何检查它是否与自身相交(用户创建了一个完整的循环)?

3个回答

2
格雷厄姆•考克斯(Graham Cox)在如何检测CGPathRef和CGRect相交方面有一些非常有趣的想法,这与您的问题类似,可能很有教育意义。底层问题很难,大多数实际解决方案都将是近似解。
您还可以查看此SO文章,其中涉及CGPathRef交叉问题,与您的问题也相似,提出的解决方案中有些与上述格雷厄姆的相同。

谢谢...我尝试了逐像素碰撞检测,但它太敏感了。有时锯齿状的对角线运动会触发“碰撞”。 - Edgar

0

注意: 这个答案是针对早期版本的问题,当时我认为问题在于确定路径是否关闭。

我认为如果当前点==起始点,则将路径视为封闭。

我知道检查这一点最简单的方法是自己跟踪这两个点,并检查它们是否相等。也可以使用CGPathGetCurrentPoint,只需跟踪起始点与其进行比较即可。

以下是一种迂回的方法,可以找到起始点,如果直接跟踪起始点很困难:

  • 复制路径
  • 存储其当前点
  • 调用CGPathCloseSubpath
  • 检查当前点是否更改

如果更改,则原始路径未关闭;否则已关闭。


抱歉,我表达得不够清楚...我尝试过这样做,但有时用户的触摸会与路径相交,这时就需要将其闭合。我尝试将其与路径中的所有点进行比较,但其中许多点之间的距离只有几个像素。 - Edgar

0

这是一种检查由单个连续线段组成的路径是否自相交的方法。

我相信,如果你想要更快的实现,可以通过使用一些好的思考和完全访问CGPath内部数据来获得。这个想法侧重于快速编码,尽管我认为它仍然会相当快:

基本上,取路径的两个副本,并以两种不同的方式填充它。一个填充使用CGContextEOFillPath,而另一个使用CGContextFillPath。结果将不同于路径自相交。

您可以通过在difference blend mode中混合结果并测试生成的原始图像数据是否全部为0(全部为黑色)来检查结果是否不同。

有点巧妙,但也(相对)容易编码。

** 附言 ** 我刚意识到这种方法并不总是有效的 - 例如,它无法检测到数字“8”,但可以检测到椒盐脆饼。


谢谢您的回复。我一直在尝试这样做,但在CGBitmapContext中对单独的路径使用CGContextFillPath/CGContextEOFillPath时遇到了麻烦。我应该用白色还是黑色来填充它们? - Edgar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接