0

解決策が見つからない非常に興味深い問題があります。空間内の ox 長方形またはボックスのセットが与えられ、タッチの座標が与えられると、タッチ ポイントが属するボックスを見つけることができます。最初は、長方形の中心からの点のユークリデナ距離を使用しました。

しかし、明らかに、これは常に機能するとは限りません。それぞれ中心が a と c の 2 つのボックスがある次の図を想定します。

----------
|        |
|        |
|   a    |
|        |
|        |
|   x    |
----------
|        |
|   c    |
|        |
----------

タッチポイントは「x」で、ボックス「a」に属しています。私のアルゴリズムでは、x は a よりも c に最も近く、これは間違っています。助言がありますか?

4

4 に答える 4

2

CGRectContainsPointメソッドがすべての作業を行います。たとえば、タップ ジェスチャを使用したとします。

-(void)handleTap:(UITapGestureRecognizer *)gesture {

    CGPoint point = [gesture locationInView:self.view];

    if (CGRectContainsPoint(box.frame, point)) {
       NSLog@("Point is in Box");
    }       
}
于 2013-07-26T15:23:33.233 に答える
1

この回答は、ビューを操作しているのではなく、さまざまな長方形の領域を含むモデルを扱っているという前提に基づいています。

ボックスのリストをたどり、関数を使用するだけですBOOL CGRectContainsPoint(rect, point);

例 (長方形が NSValues でボックス化され、NSArray に格納されると仮定します):

NSArray* arrayOfRects = ...;
CGPoint point = CGPointMake(xTouch, yTouch);

CGRect rectResult = CGRectNull;

for (NSValue* rectObj in arrayOfRects) {
    CGRect rect = [rectObj CGRectValue];
    if (CGRectContainsPoint(rect, point)) {
        rectResult = rect;
        break;
    };
}

if (!CGRectEqualToRect(rectResult, CGRectNull)) {
    // Found a matching rect!
}
else {
    // Touch was outside of any recognised rect
}

このソリューションは、重なり合う長方形を処理しません。これが必要な場合は、次のように一致のコレクションを保持する必要があります。

NSArray* arrayOfRects = ...;
CGPoint point = CGPointMake(xTouch, yTouch);

NSMutableArray* rectResultArray = [NSMutableArray array];

for (NSValue* rectObj in arrayOfRects) {
    if (CGRectContainsPoint([rectObj CGRectValue], point)) {
        [rectResultArray addObject:rectObj];
    };
}

if (rectResultArray.count > 0) {
    // Found matching rects!
}
else {
    // Touch was outside of any recognised rect
}
于 2013-07-26T15:25:58.460 に答える
0

ボックスの中心までの距離を使用できないことに気付いているのは正しいです。これを自分でコード化するか、事前に作成された関数を使用することができますCGRectContainsPoint()

于 2013-07-26T15:25:01.173 に答える
0

これを使用できます。

//get the location of the touch
touch = [[event allTouches] anyObject];
location = [touch locationInView:view];

//check if touchpoint belongs to a box
if (CGRectContainsPoint(self.boxA.frame, location))
{
     NSLog(@"Touchpoint is in box A");
}
else if (CGRectContainsPoint(self.boxB.frame, location))
{
     NSLog(@"Touchpoint is in box B");
}
else
{
     NSLog(@"Touchpoint is not in box");
}       
于 2013-07-26T15:27:13.263 に答える