配列から2つのオブジェクトを同時に取得するために、別のforループ内でforループを実行していますが、もっと良い方法があるはずです。それらが衝突するかどうかを確認してから、ビューと配列から削除したいだけです。
4 に答える
あなたはあなたがcollide
何を意味するのかを私たちに伝えずにあなたの質問でその言葉を使用しました-それがこれまでの他の回答が役に立たない理由です:)彼らは「辞書/配列の重複アイテム」のように衝突について話しているが、あなたは衝突を意味しますのようにoverlay on the screen
。
これはおそらく、このテストを行う最悪の方法です。大量の画像を取得すると、急速に遅くなりすぎます。あなたが解決しようとしている問題は、私たちのどちらよりもはるかに賢い人々によって解決されていると思わずにはいられません -正確には何をしようとしているのですか - 完全な物理エンジンは、あなたの目的を達成するためのより良い方法かもしれません.最終目標?
たとえば、シマリスが使用する空間ハッシュ データ構造を見てみましょう。これにより、すべてのオブジェクトを含むツリーが作成されます。ツリーの同じ葉にないオブジェクトは衝突できないため、比較をすばやく減らすことができます。ただし、そのリンクには、ここで説明できるよりも原理をよりよく説明する図がいくつかあります:)
まだ行っていない場合は、これを試して内側のループを最適化できます。
// Compare each image with the others to see if they overlap
NSMutableSet *colliding = [NSMutableSet new];
for (NSInteger indexA = 0; indexA < myImages.count; ++indexA) {
UIView *a = [myImages objectAtIndex:indexA];
CGRect rectA = a.frame;
for (NSInteger indexB = indexA; indexB < myImages.count; ++indexB) {
UIView *b = [myImages objectAtIndex:indexB];
if (a==b) continue;
CGRect rectB = b.frame;
CGRect intersection = CGRectIntersect(rectA, rectB);
if (NO == CGRectIsNull(intersection)) {
[colliding addObject:a];
[colliding addObject:b];
}
}
}
// Remove the colliding images
for (UIView *c in colliding) {
[c removeFromSuperview];
[myImages removeObject:c];
}
NSCountedSetを使用できます。
NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"1",@"0",nil];
NSCountedSet *set = [[NSCountedSet alloc] initWithArray:array];
NSLog(@"%@",set); // (1 [2], 0 [1]) // object 1 is collide
for(id obj in set)
{
if ([set countForObject:obj]>1) {
//collide
}
}
NSArray
scontainsObject:
には、内側のループの代わりに使用できるメソッドがあります。[NSSet setWithArray:]
しかし、すべてのオブジェクトを 1 つのセット ( ) に入れ、他の配列をループして、それらがセット内にあるかどうかを確認する方が高速な場合があります (誰かがベンチマークして確認する必要があります) 。または、両方を変換して使用しますintersectSet:
(変更可能なコピーで)。私の推測では、配列が大きくなるにつれて set メソッドの方が高速になると思いますが、あなたが持っている数値では違いはありません。
同時に 2 つの異なる配列にあるオブジェクトを見つける方法をお探しですか?
もしそうなら、の使用をお勧めしindexesOfObjectsPassingTest:
ますNSArray
。
@implementation NSArray (Comparison)
- (NSIndexSet *)indexesOfObjects:(NSArray *)objects {
return [self indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
return [objects containsObject:obj];
}];
}
- (NSArray *)objectsCommonWithArray:(NSArray *)array {
return [self objectsAtIndexes:[self indexesOfObjects:array]];
}
@end
次に、これを行うことができます:
// assuming array1 and array2 exist.
NSArray *commonObjects = [array2 objectsCommonWithArray:array2];