обнаружение столкновения нескольких изображений - PullRequest
2 голосов
/ 12 января 2012

вот проблема

У меня есть 5 шариков, плавающих по экрану, которые отскакивают от боков, сверху и снизу. это отлично работает.

Что я хочу сделать сейчас, так это выяснить, сталкиваются ли они друг с другом.

я знаю о

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

}

но это проверяет только два изображения, мне нужно проверить все и каждое из них ..

Я проверял везде, но не могу найти ответ, только другие ищут то же самое, есть идеи?

заранее спасибо

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 проверяется против других, но не проверяет мяч 2 против них. это почти там?

}

Ответы [ 2 ]

0 голосов
/ 12 января 2012

Идеальным решением является сохранение всех прямоугольников в дереве интервалов или дереве сегментов для эффективного вычисления любых перекрывающихся областей. Обратите внимание, что вам придется обобщить до двух измерений для вашего варианта использования.

Другим эффективным подходом было бы использование дерева K-d для поиска ближайших других шаров и сравнения с ближайшим соседом до тех пор, пока не произойдет столкновение.

Простой подход состоит в том, чтобы просто перебрать все шары и сравнить их со всеми другими шарами с более высоким ID (чтобы избежать двойной проверки ball1 -> ball2 и ball2 -> ball1).

Поскольку у вас есть только 5 сразу, итеративный подход, вероятно, достаточно быстр, чтобы не пропускать кадры в анимации, но вы должны рассмотреть более масштабируемое решение, если вы планируете поддерживать больше шаров, так как простой подход запускается в квадратичное время .

0 голосов
/ 12 января 2012

Это забавная маленькая математическая задача, чтобы избежать лишнего.

Вы можете создать массив изображений.И пройдитесь по нему, проверяя, сталкивается ли каждый член с какими-либо последовательными членами.

Я могу разобрать это больше с помощью кода, если это необходимо.

РЕДАКТИРОВАТЬ Я не смог устоять

// 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
    }
  }
}
...