【问题标题】:Determine which rectangle a touch point belongs to确定触摸点属于哪个矩形
【发布时间】:2017-12-28 05:54:15
【问题描述】:

在我的 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)

EDIT2:我遇到了this post,这是非常相似的问题。我想找到一个好的 swift/objective-c 实现。

【问题讨论】:

    标签: ios swift gameplay-kit


    【解决方案1】:

    我认为任何非自定义的 R-tree 实现都不会提供您真正需要的东西。您可以使用GKRTree 来实现您想要的。

    • 确定每个四边形的边界框并将其插入GKRTree。我假设并非所有这些都是轴对齐的框,如果是这样,您可以使用实际形状作为边界框。

    • Query 用户触摸屏幕的足够小的矩形。返回的形状是候选匹配。

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

    【讨论】:

    • 感谢您的来信。这正是我试图做的。但是,它似乎不适用于我的情况。问题是这样的:当我将触摸点(扩展为一个小矩形)设置为小并且它位于目标框内时,GKRTree 不会返回该目标框。事实上,即使我定义了一个与我的目标框相交的查询矩形,它仍然不会返回我的目标框。这是我的示例代码。我将该示例代码添加到我的问题中。
    • 现在,我想我知道您所说的“足够小的矩形”是什么意思(一个相当大的记录,将包含我的目标框)。就我而言,它需要一些工作才能做到这一点。因为目标形状没有很好的定义。
    • 每个矩形都是一个视图不是吗?
    猜你喜欢
    • 2016-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 2012-03-24
    • 1970-01-01
    相关资源
    最近更新 更多