在不重复地迭代数组之间进行迭代

3

我正在编写一个简单的游戏,并使用简单的碰撞检测系统。

我目前有这段代码来迭代同一数组,以便我可以检查对象是否彼此靠近并且是否会发生碰撞:

var objects = []; //assume this is not empty


for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      //collision handling
    }
  }
}

但是这段代码的主要问题是我有重复项。例如,我检查了 i 和 a ,但在稍后的某个地方,我使用相同的值检查了 a 和 i。

我尝试使用一个保存哪些对象与哪些对象进行了检查的数组,但这会导致我的帧率大幅下降。

什么是最好的方法来解决这个问题?


1
“objects”数组的内容是什么? - Nina Scholz
这只是一个包含圆的数组,其中每个圆都有x位置、y位置、半径以及x和y向量。 - ruttydm
2个回答

7

在当前第一个for循环的位置开始第二个for循环:

for(i=0;i<objects.length;i++){
    for(a=i+1;a<objects.length;a++){
      //collision handling
    }
}

这种方法只会将数组中当前项之后的每一项与当前项进行比较。
让我们来检查您的原始代码:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
    }
  }
}

现在,让我们来看一下我的例子:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=i+1;a<objects.length;a++){
    console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
  }
}

通常的想法是仅将每个项与其后面的项进行比较:

[a, b, c, d]
 a => vs b, c, d    ar[0] vs ar[1], ar[2], ar[3]
    b => vs c, d    ar[1] vs        ar[2], ar[3]
       c => vs d    ar[2] vs               ar[3]

这不是相同的代码,这个更好,因为它没有进行相同的检查... - epascarello
@Roberrrt,不是这样的。这样做就不必检查objects[2]和objects[5]是否重复,以及后来的objects[5]和objects[2]。 - Dekel
我认为这是正确的答案。它更高效,因为它隐式跳过任何重复的索引,并仅检查数组中的唯一索引。 - VLAZ
不,我需要将数组中的每个单独项与数组中的每个其他单独项进行比较,而不重复比较两个单独项。 - ruttydm
哦,抱歉。它可以工作!我以为它不会工作,但我错了。现在,我只是不明白这是如何工作的。 - ruttydm
显示剩余4条评论

1

2
我认为你误解了OP的需求。OP并不是在寻找防止重复的方法,而是需要一种使比较唯一的方法(不重复进行相同的比较)。 - devlin carnate
哦,当我发布我的答案时,那并不清楚。不过感谢@devlincarnate澄清了这一点。 - colecmc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接