Как перебрать список массивов объектов C #? - PullRequest
0 голосов
/ 29 июня 2018

Я строю симуляцию двумерной физики и сейчас работаю над обнаружением столкновений между вращающимися квадратами.

Мой алгоритм обнаружения столкновений работает следующим образом:

  • Широкая фаза
    • Проверьте, не перекрывается ли смещенный по оси ограничивающий прямоугольник
    • Если это так, поместите 2 блока, которые перекрываются, в массив из 2 элементов и поместите этот массив в список (broadPhaseCollisionList)
  • Узкая фаза
    • Перейдите через broadPhaseCollisionList и изучите коллизии (представленные в рамке []), чтобы определить, действительно ли они сталкиваются

Проблема заключается в том, что первый Console.WriteLine () выводит правильные индексы Box, а второй Console.WriteLine () всегда выводит «ObserverBox: 2 ObservedBox: 3» при возникновении коллизии в широкой фазе.

Вот мой код:

        //set all boxes to "not colliding"
        foreach (Box box in boxList)
        {
            box.colliding = false;
        }

        List<Box[]> broadPhaseCollisionList = new List<Box[]>();
        Box[] collisionPair = new Box[2];

        for (int i = 0; i < boxList.Count; i++)
        {
            Box observerBox = boxList[i];

            for (int j = i + 1; j < boxList.Count; j++)
            {
                Box observedBox = boxList[j];

                if (observerBox != observedBox)
                {
                    collisionPair[0] = observerBox;
                    collisionPair[1] = observedBox;

                    if (TestAABBOverlap(observerBox.aabb, observedBox.aabb))
                    {
                        observerBox.colliding = true;
                        observedBox.colliding = true;

                        broadPhaseCollisionList.Add(collisionPair);
                        //timer.Stop();
                        Box[] box = broadPhaseCollisionList[0];
                        Console.WriteLine("ObserverBox: " + box[0].index + " ObservedBox: " + box[1].index);
                    }
                }
            }
        }

        for (int i = 0; i < broadPhaseCollisionList.Count; i++)
        {
            Box[] collision = broadPhaseCollisionList[i];
            Box observerBox = collision[0];
            Box observedBox = collision[1];

            Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);
            Console.WriteLine("/-------------------------------------------------------------------------------");
        }

Почему это не работает?

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

Вы всегда пишете значения box [0] и box [1].
Ваша строка, вероятно, должна быть:

Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);
0 голосов
/ 29 июня 2018

Я считаю, что проблема в том, что вы добавляете ссылку на массив collisionPair к вашему broadPhaseCollisionList на каждой итерации (вы добавляете одну и ту же ссылку снова и снова). Между тем, элементы collisionPair обновляются с последним столкновением на каждой итерации.

В конце вашего цикла collisionPair содержит последнюю пару коллизий, а broadPhaseCollisionList содержит элементы [collisionCount], указывающие на один и тот же массив.

Чтобы исправить это, вы должны установить collisionPair в новый массив каждый раз перед добавлением его в свой список:

if (observerBox != observedBox && TestAABBOverlap(observerBox.aabb, observedBox.aabb))
{
    observerBox.colliding = true;
    observedBox.colliding = true;

    broadPhaseCollisionList.Add(new[] {observedBox, observerBox});
0 голосов
/ 29 июня 2018

Вы должны сверлить.

broadPhaseCollisionList[i].observerBox[0].ToString()
...