繁体   English   中英

用于碰撞检测的C ++双迭代器循环

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM