我在OpenGL ES中绘制了一条路径。如果需要,我可以将它转换为CGPath。
如何检查它是否与自身相交(如果用户创建了完整的循环)?
答案 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,尽管它会检测到椒盐卷饼。