确定触摸点属于哪个矩形

5
在我的iOS应用中,我有许多盒子(四边形)。我想知道最好的数据结构是什么,以便检测屏幕上的触摸是否在哪个盒子内。
我已经阅读了GameplayKit中的GKRTree和GKQuadTree。看起来它们都不完全符合我的需求。GKRTree允许灵活的四边形,但不支持按点查询。GKQuadTree支持按点查询,但似乎不允许灵活的形状/大小。
编辑:添加一个示例代码以证明在目标框内部的框的查询不返回目标框。
import UIKit
import GameplayKit

// target rec.
let rec1v1 = vector_float2(0.0, 0.0)
let rec1v2 = vector_float2(10.0, 10.0)
// outside target rec
let rec2v1 = vector_float2(11.0, 11.0)
let rec2v2 = vector_float2(12.0, 12.0)
//small box inside target rec
let rec3v1 = vector_float2(1.0, 1.0)
let rec3v2 = vector_float2(2.0, 2.0)
// small box intersect with target rec
let rec4v1 = vector_float2(9.0, 9.0)
let rec4v2 = vector_float2(11.0, 11.0)


var mytree = GKRTree<NSString>(maxNumberOfChildren: 3)
mytree.addElement("rec1v1",
              boundingRectMin: rec1v1,
              boundingRectMax: rec1v2,
              splitStrategy: GKRTreeSplitStrategy.linear)
let t1 = mytree.elements(inBoundingRectMin: rec2v1, rectMax: rec2v2) // return [] (outside)
let t2 = mytree.elements(inBoundingRectMin: rec3v1, rectMax: rec3v2) // return [] (inside target box but smaller)
let t3 = mytree.elements(inBoundingRectMin: rec1v1, rectMax: rec1v2) // return ["rec1v1"] (same box)
let t4 = mytree.elements(inBoundingRectMin: rec4v1, rectMax: rec4v2) // return [] (intersect with target box but not containing)

编辑2:我看到了这篇帖子,它与我的问题非常相似。 我想找一个好的Swift/Objective-C实现。

1个回答

2

我认为没有任何非定制的R树实现可以提供您所需的内容。但是,您可以使用 GKRTree 来实现您想要的功能。

  • 确定并将每个四边形的边界框插入到 GKRTree 中。我假设它们不全是轴对齐的框,如果是这样,您可以使用实际形状作为边界框。

  • 查询 用户触摸屏幕的足够小的矩形。返回的形状是候选命中。

  • 遍历候选命中以确定触摸点是否位于实际形状内,而不仅仅是其边界框内。


谢谢您的留言。那正是我尝试做的事情。但是,在我的情况下似乎不起作用。问题在于:当我将触摸点(扩展为小矩形)设置得很小,并且它在目标框内时,GKRTree不会返回该目标框。实际上,即使我定义一个与我的目标框相交的查询矩形,它仍然不会返回我的目标框。这是我的示例代码。我将这个示例代码添加到我的问题中。 - BSharer App - Share Books
现在,我认为我知道你所说的“足够小的矩形”是什么意思了(一个足够大的矩形将包含我的目标框)。在我的情况下,这需要一些工作才能实现。因为目标形状并没有很好地定义。 - BSharer App - Share Books
每个矩形都是一个视图,不是吗? - Abu Ul Hassan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接