2017-12-28 11 views
4

내 iOS 앱에는 많은 상자 (사각형)가 있습니다. 화면상의 터치가 어느 상자 안에 있는지를 감지 할 수있는 최상의 데이터 구조가 무엇인지 궁금합니다.터치 포인트가 속한 직사각형을 결정하십시오.

나는 GameplayKit에서 GKRTree와 GKQuadTree에 대해 읽었습니다. 그 중 누구도 내가 필요한 것만은 아닌 것처럼 보입니다. GKRTree는 유연한 쿼드를 허용하지만 한 지점까지 쿼리를 지원하지 않습니다. GKQuadTree는 점으로 쿼리를 지원하지만 유연한 모양/크기를 허용하지 않습니다.

도와주세요. 감사

EDIT : 대상 상자 안의 상자가있는 쿼리가 대상 상자를 반환하지 않는다는 것을 보여주기 위해 샘플 코드를 추가하십시오.

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 통해 온, 그것은 매우 같은 문제입니다. 나는 신속하고 객관적인 실행을 찾고 싶다.

답변

2

사용자 정의 R 트리 구현이 사용자에게 정확히 필요한 것을 제공하지 않는다고 생각합니다. GKRTree을 사용하면 원하는 것을 얻을 수 있습니다.

  • 가 결정하고 GKRTree로 사각형의 각 경계 상자를 삽입합니다. 나는 모든 것들이 축 정렬 상자라고 가정하지 않습니다. 그렇다면 실제 모양을 경계 상자로 사용할 수 있습니다.

  • Query 사용자가 화면을 터치하는 데 충분한 작은 사각형. 반환 된 모양은 후보 히트입니다.

  • 터치 포인트가 바운딩 상자가 아닌 실제 모양 내에 있는지를 확인하기 위해 후보 히트를 반복합니다.

+0

메모 주셔서 감사합니다. 그게 정확히 내가하려고했던 것이었다. 그러나, 그것은 내 경우에는 작동하지 않는 것 같습니다. 문제는 다음과 같습니다. 터치 포인트 (작은 직사각형으로 확장)를 작게 설정하고 대상 상자 내부에있는 경우 해당 대상 상자는 GKRTree에 의해 반환되지 않습니다. 사실, 대상 상자와 쿼리 rect가 교차한다고 정의하더라도 대상 상자를 반환하지는 않습니다. 여기 내 샘플 코드입니다. 내 질문에 샘플 코드를 추가하고 있습니다. –

+0

자, 저는 여러분이 "작은 사각형"(내 대상 상자를 포함 할 꽤 큰 rec)으로 무엇을 의미하는지 알고 있다고 생각합니다. 제 경우에는 그렇게 할 수있는 일이 필요할 것입니다. 목표 모양이 잘 정의되지 않았기 때문입니다. –

+0

모든 사각형은 뷰가 아닙니까? –