4

我正在制作一个允许用户用手指在屏幕上绘制不同颜色的应用程序。这些图纸是用 UIBezierPaths 绘制的,但我需要一个橡皮擦。我确实有一个橡皮擦,它只是一条以背景图像为颜色的路径,但这种方法会导致内存问题。我想从选择橡皮擦时绘制的任何路径中删除点。

不幸的是 UIBezierPath 没有减法功能,所以我想自己做。因此,如果选择了橡皮擦,它将查看所​​有应擦除的点并查看是否有任何现有路径包含这些点,然后细分路径留下空白点。但是它应该能够看到连续删除多少个点而不是一次删除一个。从理论上讲,这是有道理的,但我在开始实施时遇到了麻烦。

有人有任何指导可以让我走上正确的“道路”吗?

4

1 回答 1

3

乍一看,您似乎可以通过简单地使用 UIBezierPath 来进行命中检测containsPoint:。如果您想确定该点是否包含在 UIBezierPath 的填充中,这可以正常工作,但它不适用于确定 UIBezierPath 的笔划是否与该点相交。检测给定点是否在 UIBezierPath 的笔划中可以按照本页底部的“在路径上进行命中检测”部分中的描述来完成。实际上,他们提供的代码示例可以使用任何一种方式。基本思想是您必须使用核心图形方法CGContextPathContainsPoint

根据橡皮刷的大小,您可能需要检查画笔圆边缘上的几个不同点以查看它们是否与曲线相交,并且您可能必须遍历 UIBezierPaths 直到获得成功。您应该能够使用boundsUIBezierPath 优化搜索。

在检测到一个点与 UIBezierPath 相交后,您必须对路径进行实际拆分。在这篇文章中似乎有一个很好的算法大纲。主要思想是使用De Casteljau 算法来执行曲线的细分。您应该能够通过快速搜索找到该算法的各种实现,包括 C++ 中的一些。

于 2012-07-27T21:32:06.460 回答