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

时间:2009-08-22 00:00:05

标签: iphone objective-c path cocos2d-iphone touch

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

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

3 个答案:

答案 0 :(得分:2)

格雷厄姆考克斯有一些very interesting thoughts关于如何检测CGPathRef和CGRect的交集,这与您的问题类似,可能具有教育意义。潜在的问题很难,而且大多数实际的解决方案都是近似的。

您可能还想查看CGPathRef intersection上的这篇SO文章,这也与您的问题相似,并且一些提议的解决方案与Graham上面的解决方案相同。

答案 1 :(得分:0)

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

如果当前点= =起点,我认为路径被视为已关闭。

我知道要检查的最简单方法是自己跟踪这两点,并检查是否相等。您也可以使用CGPathGetCurrentPoint,并且只跟踪起点以与此进行比较。

如果难以直接跟踪它,这是找到起点的迂回方式:

  • 制作路径的副本
  • 存储其当前点
  • 致电CGPathCloseSubpath
  • 检查当前点是否发生变化

如果确实改变了,原来的路径是开放的;否则关闭。

答案 2 :(得分:0)

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

我敢肯定,如果您想要更快的实施,您可以通过使用一些良好的思维和对CGPath内部数据的完全访问权来获得一个。这个想法专注于快速编码,虽然我怀疑它仍然会相当快:

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

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

哈基,是的。但也(相对)容易编码。

**附录**我刚刚意识到这不会在100%的时间内起作用 - 例如,它不会检测到数字8,尽管它会检测到椒盐卷饼。