Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查绘制路径/CGPath是否在iPhone游戏中与自身相交_Iphone_Objective C_Path_Cocos2d Iphone_Touch - Fatal编程技术网

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

检查绘制路径/CGPath是否在iPhone游戏中与自身相交,iphone,objective-c,path,cocos2d-iphone,touch,Iphone,Objective C,Path,Cocos2d Iphone,Touch,我在OpenGL ES中绘制了一条路径。如果需要,我可以将其转换为CGPath 我该如何检查它是否与自身相交(如果用户创建了一个完整的循环)?注意:这是对问题早期版本的回答,我认为问题在于确定路径是否闭合 我认为当当前点=起点时,路径被视为闭合的 我所知道的检查这一点的最简单方法是自己跟踪这两点,并检查是否相等。您还可以使用,并且只跟踪起点以与此进行比较 如果很难直接跟踪,这里有一个迂回的方法来找到起点: 复制路径 存储其当前点 调用CGPathCloseSubpath 检查当前点是否已更改

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


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

注意:这是对问题早期版本的回答,我认为问题在于确定路径是否闭合

我认为当当前点=起点时,路径被视为闭合的

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

如果很难直接跟踪,这里有一个迂回的方法来找到起点:

  • 复制路径
  • 存储其当前点
  • 调用
    CGPathCloseSubpath
  • 检查当前点是否已更改
如果它确实改变了,那么原来的路径是开放的;否则关闭。

Graham Cox介绍了如何检测CGPathRef和CGRect的交点,这与您的问题类似,可能具有教育意义。根本问题是困难的,最实际的解决方案将是近似值


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

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

我确信,如果您想要更快的实现,您可以通过使用一些好的想法和对
CGPath
内部数据的完全访问来实现。这一想法侧重于快速编码,尽管我怀疑它仍然会相当快:

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

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

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


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

对不起,我不清楚……我试过了,但有时用户的触摸会与路径相交,然后需要关闭。我试着比较路径中的所有点,但是很多点之间的距离只有几个像素。谢谢你的回复。我一直在尝试,但在CGBitmapContext中的不同路径上使用CGContextFillPath/CgContextOfillPath时遇到了问题。我应该用白色还是黑色来填充它们?谢谢…我试过每像素碰撞检测,但它太敏感了。有时,锯齿状的对角线运动会触发“碰撞”。