我在 OpenGL ES 中绘制了一条路径。如果需要,我可以将其转换为 CGPath。
我将如何检查它是否与自身相交(如果用户创建了一个完整的循环)?
我在 OpenGL ES 中绘制了一条路径。如果需要,我可以将其转换为 CGPath。
我将如何检查它是否与自身相交(如果用户创建了一个完整的循环)?
Graham Cox对如何检测 CGPathRef 和 CGRect 的交集有一些非常有趣的想法,这与您的问题相似并且可能具有教育意义。潜在的问题是困难的,大多数实际的解决方案将是近似值。
您可能还想查看这篇关于CGPathRef 交叉点的 SO 文章,这也与您的问题类似,并且一些建议的解决方案与 Graham 的上述相同。
注意:此答案是针对该问题的早期版本,我认为问题在于确定路径是否已关闭。
我认为如果当前点==起点,则路径被认为是封闭的。
我知道的最简单的检查方法是自己跟踪这两点,并检查是否相等。您也可以使用CGPathGetCurrentPoint
, 并且仅跟踪起点以与此进行比较。
如果很难直接跟踪它,这是一种找到起点的迂回方法:
CGPathCloseSubpath
如果它确实发生了变化,则原始路径是开放的;否则关闭。
这是一种检查由单个连续段组成的路径是否自相交的方法。
我敢肯定,如果您想要一个更快的实现,您可以通过一些好的思考和对CGPath
内部数据的完全访问来获得一个。这个想法侧重于快速编码,尽管我怀疑它仍然会相当快:
基本上,获取路径的两个副本,并以两种不同的方式填充它。一补用CGContextEOFillPath
,一补用CGContextFillPath
。如果路径是自相交的,结果会有所不同。
您可以通过在差异混合模式下将结果混合在一起来检查结果是否不同,并测试生成的原始图像数据是否全为 0(全黑)。
哈基,是的。但也(相对)容易编码。
** 附录 ** 我刚刚意识到这不会在 100% 的情况下起作用 - 例如,它不会检测到数字 8,尽管它会检测到椒盐卷饼。