如何遍历对象数组列表 C#?
How to iterate through a List of Arrays of Objects C#?
我正在构建 2D 物理模拟,目前正在研究旋转方块之间的碰撞检测。
我的碰撞检测算法是这样工作的:
- 广相
- 检查 Boxes 的轴对齐边界框是否重叠
- 如果是这样,将重叠的 2 个框放入一个 2 元素数组,并将此数组放入一个列表 (broadPhaseCollisionList)
- 窄相
- 遍历 broadPhaseCollisionList 并检查碰撞(由 Box[] 表示)以判断它们是否真的发生碰撞
问题是第一个 Console.WriteLine() 打印出正确的 Box 索引,但是第二个 Console.WriteLine() 总是打印出 "ObserverBox: 2 ObservedBox: 3" 当有一个 broad-phase碰撞.
这是我的代码:
//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("/-------------------------------------------------------------------------------");
}
为什么这不起作用?
你必须向下钻取。
broadPhaseCollisionList[i].observerBox[0].ToString()
您总是在写 box[0] 和 box[1] 的值。
您的行可能应该是:
Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);
我认为这里的问题是您只是在每次迭代中向 broadPhaseCollisionList
添加对 collisionPair
数组的引用(您一遍又一遍地添加相同的引用)。同时,collisionPair
项目在每次迭代中更新最新的碰撞。
在循环结束时,collisionPair
包含最后一个碰撞对,broadPhaseCollisionList
包含 [collisionCount] 个项目,所有项目都指向同一个数组。
要解决此问题,您应该在每次将 collisionPair
添加到列表之前将其设置为 new 数组:
if (observerBox != observedBox && TestAABBOverlap(observerBox.aabb, observedBox.aabb))
{
observerBox.colliding = true;
observedBox.colliding = true;
broadPhaseCollisionList.Add(new[] {observedBox, observerBox});
我正在构建 2D 物理模拟,目前正在研究旋转方块之间的碰撞检测。
我的碰撞检测算法是这样工作的:
- 广相
- 检查 Boxes 的轴对齐边界框是否重叠
- 如果是这样,将重叠的 2 个框放入一个 2 元素数组,并将此数组放入一个列表 (broadPhaseCollisionList)
- 窄相
- 遍历 broadPhaseCollisionList 并检查碰撞(由 Box[] 表示)以判断它们是否真的发生碰撞
问题是第一个 Console.WriteLine() 打印出正确的 Box 索引,但是第二个 Console.WriteLine() 总是打印出 "ObserverBox: 2 ObservedBox: 3" 当有一个 broad-phase碰撞.
这是我的代码:
//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("/-------------------------------------------------------------------------------");
}
为什么这不起作用?
你必须向下钻取。
broadPhaseCollisionList[i].observerBox[0].ToString()
您总是在写 box[0] 和 box[1] 的值。
您的行可能应该是:
Console.WriteLine("ObserverBox: " + observerBox.index + " ObservedBox: " + observedBox.index);
我认为这里的问题是您只是在每次迭代中向 broadPhaseCollisionList
添加对 collisionPair
数组的引用(您一遍又一遍地添加相同的引用)。同时,collisionPair
项目在每次迭代中更新最新的碰撞。
在循环结束时,collisionPair
包含最后一个碰撞对,broadPhaseCollisionList
包含 [collisionCount] 个项目,所有项目都指向同一个数组。
要解决此问题,您应该在每次将 collisionPair
添加到列表之前将其设置为 new 数组:
if (observerBox != observedBox && TestAABBOverlap(observerBox.aabb, observedBox.aabb))
{
observerBox.colliding = true;
observedBox.colliding = true;
broadPhaseCollisionList.Add(new[] {observedBox, observerBox});