2012-01-11 16 views
2

heres問題マルチ画像衝突検出

私は5つのボールが画面の周りに浮かんで、側面と上下を跳ねます。それは素晴らしい仕事です。

私が今したいことは、それらのどれかが互いに衝突した場合にうまくいくことです。 、同じ検索のみ他人を

は、私は約

if (CGRectIntersectsRect(image1.frame, image2.frame)) 
{ 

} 

知っているが、2つの画像のみをチェックすることを、私はすべてのそれらのそれぞれをチェックする必要があります。..

IVEはどこにでも確認したが、答えを見つけるカント事、どんなアイデア?事前に

おかげ

Spriggsy

編集:

イムはCGRectを見つけて、

ball1 = NSStringFromCGRect(image1.frame); 
ball2 = NSStringFromCGRect(image2.frame); 
ball3 = NSStringFromCGRect(image3.frame); 
ball4 = NSStringFromCGRect(image4.frame); 
ball5 = NSStringFromCGRect(image5.frame); 

bingoarray = [NSMutableArray arrayWithObjects:ball1,ball2,ball3,ball4,ball5,nil]; 

はこの後、衝突検出に渡される配列に格納し、これを使用して方法

-(void)collision { 


    for (int i = 0; i<[bingoarray count]-1 ; i++) { 

     CGRect ballA = CGRectFromString([bingoarray objectAtIndex:i]); 

     if (CGRectIntersectsRect(ballA, image1.frame)) { 
      NSLog(@"test"); 
     } 
    } 

これは私が他のすべてに対して1つのボールをチェックすべきだと思います。

ボール1は他のボールに対してチェックされますが、ボール2をチェックしません。これはほとんどそこにありますか?冗長なことを避けるための楽しい小さな数学の問題です

}

答えて

-1

イメージの配列を作成できます。それをループして、各メンバーが後続のメンバーと衝突するかどうかを確認します。

必要に応じて、コードで詳しく説明できます。

EDIT Iは理想的なソリューションを効率的に任意の重なり領域を計算するためにinterval tree又はsegment treeにすべての矩形を格納することである

// the images are in imagesArray 

//where you want to check for a collision 

int ballCount = [imagesArray count]; 
int v1Index; 
int v2Index; 
UIImageView * v1; 
UIImageView * v2; 
for (v1Index = 0; v1Index < ballCount; v1Index++) { 
    v1 = [imagesArray objectAtIndex:v1Index]; 
    for (v2Index = v1Index+1; v2Index < ballCount; v2Index++) { 
    v2 = [imagesArray objectAtIndex:v2Index]; 
    if (CGRectIntersectsRect(v1.frame, v2.frame)) { 
     // objects collided 
     // react to collision here 
    } 
    } 
} 
+0

ありがとうございました。 – Spriggsy

+0

@ user1139624ロジックを表示するために私の答えを更新しました。私はベンとはうまくいきませんが、ボールが5つしかない場合は、5 + 4 + 3 + 2 + 1のテストになります。あなたが100個のボールでテストする必要がある場合、それがどれほど悪くなるか想像してください –

+0

素晴らしい、多くのおかげで、すぐに働いた、毎日の学校の日、そしてまだデフレを学んでいる – Spriggsy

0

レジストことができませんでした。ユースケースに合わせて2次元に一般化しなければならないことに注意してください。

K-d treeを使用して最も近い他のボールを見つけて、衝突がなくなるまで最も近いネイバーと比較することも有効な方法です。

単純なアプローチは、( - >ball2ball2 - >ball1ball1をチェックダブル避けるために)単純にすべてのボールを反復処理し、より高いIDを持つすべての他のボールにそれらを比較することです。

反復アプローチはアニメーションのフレームをドロップしないほど速いですが、単純なアピアランスがquadratic timeで実行されるので、より多くのボールをサポートする予定がある場合は、よりスケーラブルなソリューションを検討する必要があります。

+0

よくivあなたの投稿を読んで、 – Spriggsy

+0

@ user1139624ほんの数のボールをサポートしている限り、ブルートフォースアプローチを使用することについて心配する必要はありませんが、いくつかのリソースあなたがこれを望むならばそれを拡大する。 –