来自另一个UIBezierPath的UIBezierPath减法

时间:2012-07-27 20:24:44

标签: objective-c ios cocoa-touch quartz-graphics uibezierpath

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

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

任何人都有指导我选择正确的“路径”吗?

1 个答案:

答案 0 :(得分:3)

乍一看,似乎只需使用containsPoint:即可对UIBezierPath进行点击检测。如果您想确定该点是否包含在UIBezierPath的 fill 中,那么它可以正常工作,但它不能用于确定是否只有UIBezierPath的笔划与点。检测给定点是否在UIBezierPath的笔划中可以按this page底部的“在路径上执行命中检测”部分所述进行。实际上,他们提供的代码示例可以使用任何一种方式。基本思想是你必须使用核心图形方法CGContextPathContainsPoint

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

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