[英]C++ double iterator loop for collision detection
首先,我对C ++还是很陌生! 因此,我有一个标准的对象列表,用于表示2d空间中的元素,并且我想进行一些基本的碰撞检测。 我的第一个想法(主要来自Java背景...)是将每个对象与另一个对象进行比较,调用一个函数来检查每个对或对象上的交集。 在Java中,这很简单,将ArrayList的第一项与第二,第三等进行比较,然后将第二项与第三,第四等进行比较。这就是我对C ++中的问题,但是我使用的是迭代器(而不是像Java中那样直接访问元素),但是迭代器是线性使用的,对吗? 因此,直接访问不适合。
所以我的问题是如何执行此算法? 我也有理由确定这不是进行(非常基本的)冲突检测的最佳方法,因此,对此的任何建议也将受到欢迎。 这是我的(无效)代码。
for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); p++) {
for (list<Box>::iterator q = mBoxes.begin() + p); q != mBoxes.end(); q++) {
if (p->isIntersecting(q)) {
p->changeDirection();
q->changeDirection();
}
}
}
这应该可以说明我正在尝试的方法,但是我对mBoxes.begin() + p
尝试当然不起作用!
编辑:回应多个评论。
for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); ++p) {
for (list<Box>::iterator q = p); q != mBoxes.end(); ++q) {
if (p==q) continue;
if (p->isIntersecting(*q)) {
p->changeDirection();
q->changeDirection();
}
}
}
列表类是一个链接列表,您不能直接对其进行索引。 而且,迭代器不是索引,+毫无意义。
但是,从理论上讲,您应该能够复制一个迭代器,如果将q = mboxes.begin()+ p更改为q = p,则应该将q设置为指向p相同位置的迭代器,这可能只是解决您的问题。
for (list<Box>::iterator p = mBoxes.begin(); p != mBoxes.end(); p++) {
for (list<Box>::iterator q = p, q++; q != mBoxes.end(); q++) {
if (p->isIntersecting(q)) {
p->changeDirection();
q->changeDirection();
}
}
}
q ++应该只跳过当前元素,这样就不会将项目与自身进行比较。
这样的事情应该起作用:
for (int p = 0; p < mBoxes.size(); ++p)
{
for (int q = 0; q < mBoxes.size(); ++q)
{
if (p == q)
{
// don't compare for collision against itself
continue;
}
if (mBoxes[p]->isIntersecting(mBoxes[q]))
{
mBoxes[p]->changeDirection();
mBoxes[q]->changeDirection();
}
}
}
但是,与此相关的一个问题是,在迭代过程中,您将比较p与q相交以及q与p相交,这意味着如果它们相交,它们将改变方向两次,每次将它们返回相同方向。 因此,需要一些额外的逻辑来避免这种情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.