2012-07-27 114 views
4

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

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

任何人有任何指导,让我在正确的'路径'?

+0

这是不必要的复杂。是否有一个原因,你不能光栅化的路径(即绘制它们到一个CGBitmapContext,只需在drawRect中绘制上下文)?这将消除你的记忆问题(并且使用kCGBlendModeClear代替与BG擦除相同颜色的笔画)。你的方法会很快变慢。 – borrrden 2012-07-28 02:12:18

回答

3

乍一看,你可以通过简单地使用containsPoint:来实现在UIBezier路径上的点击检测。如果您想确定该点是否包含在UIBezierPath的填充中,但它不适用于确定是否仅UIBezierPath的笔划与该点相交。检测给定点是否在UIBezierPath的行程中可以按照this page底部的“在路径上执行点击检测”部分所述完成。实际上,他们提供的代码示例可以以任何方式使用。基本思想是你必须使用核心图形方法CGContextPathContainsPoint

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

当您检测到点与UIBezierPath相交后,您必须执行实际的路径分割。在this post中似乎有一个很好的算法概要。主要想法是使用De Casteljau's algorithm来执行曲线的细分。您可以通过快速搜索找到该算法的各种实现,包括C++中的一些实现。