1

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

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

我正在考虑允许用户在对象上绘制,然后以某种方式我需要能够分辨出跟踪内部的内容(例如,他们跟踪的圆圈内部),但我预见到的一个问题是确保他们制作的痕迹是封闭的,所以我可以填写形状(这完全没有问题)。

欢迎任何关于开始这个的最佳方式的建议。

谢谢!

4

1 回答 1

2

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

基本思想是这样的:

当您的手指触摸屏幕时,开始记录位置。丢弃任何与前一个位置太接近的位置(例如,仅在距离上一个记录点 >min-distance 时才记录一个点)。执行此操作时,您可以绘制 UIBezierPath,以便查看正在追踪的内容。通过向其添加点来修改 UIBezierPath,而不是每次都重新创建它。* 当您抬起手指时,关闭贝塞尔路径。非常简单。

现在,这将产生一个多边形(即直边)。如果您的最小距离足够低,或者如果您将其用于命中检测(如您所说),那并不重要。但是,如果您想平滑路径,则必须使用曲线到方法,这会使它稍微复杂化 - 但如果您希望进一步了解这一点,请阅读样条曲线和从点序列生成样条曲线。

*注意:否则在绘制大型形状时会出现延迟,因为从越来越多的点系列重新创建贝塞尔路径会变得昂贵。修改现有路径会使它变得更快、更快。

于 2012-06-08T15:56:39.877 回答