我有一个静态地图图像,上面有一堆描绘城市的圆圈和正方形。我已经将图像加载到了一个在scrollView下子类的imageView中,这样我就可以捕获用户触摸并在地图上缩放/滚动。我的挑战是,每当用户触摸某个城市的某个圈子/方块时,我想弹出一个标签,告诉他们哪个城市,并可能加载城市的详细视图。我想我可以将基于imageView地图的城市的所有相关CGPoints预先加载到字典中,这样我就可以在“touchesBegan”事件中引用它们,但我很快就会进入我的脑海并且可能会这样做错误道。
到目前为止一切正常,我可以捕捉触摸的CGPoint x和y坐标。我遇到的最大问题是确定用户触摸与字典中可能存在的离散点的接近程度。换句话说,如果字典有“Boston = NSPoint:{235,118};”如何判断用户何时接近该点而不让他们重复触摸直到确切?是否有一种简单的方法可以确定用户触摸是否“接近”预先存在的点?我是以正确的方式来做这件事的吗?
欢迎任何建议或掌声。
谢谢,迈克
答案 0 :(得分:0)
您可以使用R-Tree,也可以计算当前视图中每个可见点的触摸距离。要计算接近度,通常使用毕达哥拉斯定理,但在这种情况下,您可以跳过平方根,因为您只是比较相对大小。如果你喜欢说50像素的平方到2500,你也可以声明一个距离被切断。所以你将结果放入一个包含距离和参考点的对象中,并将对象放在一个NSMutableArray中,而不是在你的截止下添加结果,选择最低结果。
因此,如果您有一个触摸点pT
,那么对于每个点pN
,您需要计算:
d=(pT.x-pN.x)*(pT.x-pN.x) + (pT.y-pN.y)*(pT.y-pN.y); //d is the squared distance
最低pN
的点d
是最接近pT
的点。就像我说的那样,如果你只需要10个像素内的触摸来计算,你就可以测试d <= 10*10
;
测试20x20方形区域内的触摸的方法也有效,除非两个点在彼此的20个像素内,然后您需要知道哪个是最接近的触摸点。
答案 1 :(得分:0)
您可以使用UIButtons来表示城市。然后,您将以更少的努力获得标准触摸,突出显示等行为。在地图上添加按钮作为子视图应该使它们可以缩放并与地图一起滚动。
答案 2 :(得分:0)
如果我理解正确,你想知道用户点击的点是否“足够”接近标记为城市的点。
你必须量化关闭,即设置一个阈值,之后点击更远,然后点击更接近。
一旦这样做,计算笛卡尔坐标距离sqrt((x1-x2)^ 2 +(y1-y2)^ 2) 对于数组中的每个元素(读取带有x,y值的字典),并将结果存储在另一个数组中。然后取最小的结果。如果该结果的索引小于所述阈值,则该结果的索引是最接近该抽头的城市。