我正在制作一个应用程序,允许用户用不同颜色的手指在屏幕上绘制。图纸是用 UIBezierPaths 绘制的,但我需要一个橡皮擦。我确实有一个橡皮擦,它只是一条以背景图像为颜色的路径,但这种方法会导致内存问题。我想从选择橡皮擦时绘制的任何路径中删除点。
不幸的是 UIBezierPath 没有减法功能,所以我想自己做。因此,如果选择了橡皮擦,它将查看所有应擦除的点,并查看是否有任何现有路径包含这些点,然后分割路径留下空白点。但是应该可以看到连续删除多少个点而不是一次一个。从理论上讲,这是有道理的,但我在开始实现时遇到了麻烦。
任何人都有任何指导可以让我走上正确的“道路”?
最佳答案
乍一看,您似乎可以通过简单地使用 containsPoint:
对 UIBezierPath 进行命中检测。如果您想确定该点是否包含在 UIBezierPath 的 填充 中,这可以正常工作,但它不适用于确定是否只有 UIBezierPath 的 笔划 与该点相交。可以按照 this page 底部的“在路径上进行命中检测”部分中所述来检测给定点是否在 UIBezierPath 的笔划中。实际上,他们提供的代码示例可以以任何方式使用。基本思想是您必须使用 Core Graphics 方法 CGContextPathContainsPoint 。
根据橡皮擦画笔的大小,您可能需要检查画笔圆圈边缘的几个不同点以查看它们是否与曲线相交,并且您可能必须遍历 UIBezierPaths 直到命中。您应该能够使用 UIBezierPath 的 bounds
优化搜索。
在您检测到一个点与 UIBezierPath 相交后,您必须对路径进行实际分割。 this post 中似乎有一个很好的算法概述。主要思想是使用 De Casteljau's algorithm 来执行曲线的分割。您应该能够通过快速搜索找到该算法的各种实现,包括 C++ 中的一些实现。
关于objective-c - 从另一个 UIBezierPath 减去 UIBezierPath,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11695168/