Objective C在图像上绘制自由形状

时间:2012-06-08 15:50:35

标签: iphone objective-c ios draw

我正在开发一个iOS 5 iPhone项目,用户可以在他们的设备上选择一个图像,然后跟踪图片中的一个对象(从水果篮的图片中追踪一个苹果),然后图片需要与“已标记”对象一起上传,以便以后可以下载。然后其他人将拉下图像并尝试找到标记对象在图片中的位置(想想“哪里是Waldo?”)。

我一直试图找出追踪对象的最佳方法。之前,我让用户按下对象周围的左上角,右上角,左下角和右下角,并围绕对象创建一个方形视图。该视图的信息已上载,然后下拉以供用户查找该对象。缺点是所有物体显然不是正方形/矩形,所以我需要做一个自由形状。

我在考虑让用户绘制对象,然后以某种方式我需要能够分辨出跟踪内部的内容(例如,他们追踪的圆圈内部),但我认为是一个问题是确保他们制作的痕迹是封闭的,这样我就可以填写形状(这不是问题)。

欢迎任何有关最佳启动方式的建议。

谢谢!

1 个答案:

答案 0 :(得分:2)

UIBezierPath在这里可能是一个非常有用的朋友。它允许您创建所需的任何形状,并且它支持绘图和命中检测。我最近为一本故事书做了一个实现,在那里我可以用他们的手指描绘一个形状,冻结它,然后使用这个形状进行点击检测。

基本理念是:

当手指触摸屏幕时,开始记录位置。丢弃任何太靠近先前位置的位置(例如,如果距离最后记录的点的距离是最小值,则仅记录一个点)。执行此操作时,您可以绘制UIBezierPath,以便查看要跟踪的内容。通过向其添加点来修改UIBezierPath,而不是每次都重新创建它。*当您抬起手指时,关闭贝塞尔曲线路径。很简单。

现在,这将产生多边形(即直边)。 如果您的最小距离足够低,或者您正在使用它进行命中检测(如您所说),那么这并不重要。但是,如果要平滑路径,则必须使用curve-to方法,这会使其稍微复杂化 - 但是如果您希望对此进行更多跟进,请阅读点序列中的样条线和样条生成。

*注意:否则在绘制大型形状时会出现滞后,因为从越来越大的一系列点重新创建bezier路径会变得昂贵。修改现有路径可以更快,更快。