从一个UIBezierPath中减去另一个UIBezierPath

4
我正在开发一个app,允许用户用手指以不同颜色在屏幕上绘制图形。这些图形是用UIBezierPaths绘制的,但我需要一个橡皮擦。我曾经使用过一种橡皮擦,就是将背景图片作为颜色,然后使用路径来实现,但这种方法会导致内存问题。当选中橡皮擦时,我希望能够从任何已绘制的路径中删除点。
不幸的是,UIBezierPath没有减法函数,所以我想自己实现。当选择橡皮擦时,它将查看应该被擦除的所有点,并查看现有路径是否包含这些点,然后将这些路径细分为留下空白点。但它应该能够看到连续要删除多少个点,而不是一个一个删除。理论上是有道理的,但我在实现方面遇到了麻烦。
有人能给我一些指导,让我走上正确的“路径”吗?

这个过程显得过于复杂了。你不能将路径光栅化吗?(比如将它们绘制到CGBitmapContext中,然后只需在drawRect中绘制上下文即可)这样可以解决内存问题(使用kCGBlendModeClear而不是与背景相同颜色的描边来擦除)。你的方法很快就会变慢。 - borrrden
1个回答

3
乍一看,您似乎可以通过简单地使用containsPoint:在UIBezierPath上进行命中检测。如果您想确定该点是否包含在UIBezierPath的填充中,则可以正常工作,但是它不能用于确定仅UIBezierPath的描边是否与该点相交。如何检测给定点是否在UIBezierPath的描边中可以如底部此页面所述。实际上,他们提供的代码示例可以两种方式使用。基本思路是您必须使用核心图形方法CGContextPathContainsPoint
根据橡皮擦画笔的大小,您可能需要检查刷子圆边缘上的几个不同点,以查看它们是否与曲线相交,并且您可能必须遍历UIBezierPaths直到找到匹配项。您应该能够通过使用UIBezierPath的bounds来优化搜索。
在检测到点与UIBezierPath相交后,您必须执行路径的实际拆分。在此帖子中,有一个很好的算法概述。主要思想是使用De Casteljau算法来执行曲线的细分。您应该能够通过快速搜索找到各种实现算法,包括一些C++实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接