我在OpenGL ES中绘制了一条路径。如果需要,我可以将其转换为CGPath。
如何检查它是否与自身相交(用户创建了一个完整的循环)?
我在OpenGL ES中绘制了一条路径。如果需要,我可以将其转换为CGPath。
如何检查它是否与自身相交(用户创建了一个完整的循环)?
注意: 这个答案是针对早期版本的问题,当时我认为问题在于确定路径是否关闭。
我认为如果当前点==起始点,则将路径视为封闭。
我知道检查这一点最简单的方法是自己跟踪这两个点,并检查它们是否相等。也可以使用CGPathGetCurrentPoint
,只需跟踪起始点与其进行比较即可。
以下是一种迂回的方法,可以找到起始点,如果直接跟踪起始点很困难:
CGPathCloseSubpath
如果更改,则原始路径未关闭;否则已关闭。
这是一种检查由单个连续线段组成的路径是否自相交的方法。
我相信,如果你想要更快的实现,可以通过使用一些好的思考和完全访问CGPath
内部数据来获得。这个想法侧重于快速编码,尽管我认为它仍然会相当快:
基本上,取路径的两个副本,并以两种不同的方式填充它。一个填充使用CGContextEOFillPath
,而另一个使用CGContextFillPath
。结果将不同于路径自相交。
您可以通过在difference blend mode中混合结果并测试生成的原始图像数据是否全部为0(全部为黑色)来检查结果是否不同。
有点巧妙,但也(相对)容易编码。
** 附言 ** 我刚意识到这种方法并不总是有效的 - 例如,它无法检测到数字“8”,但可以检测到椒盐脆饼。