试图返回向量

时间:2018-12-17 16:41:50

标签: c++ vector return

我是C ++编程的新手,并且试图使所有问题都移到中心,我有两种方法updateboid和cohesion。在凝聚力方面,我试图将归一化的向量返回到updateBoid中,当我这样做时,所有的辫子都向侧面移动而不是朝中心移动。我在这里做一些愚蠢的事情,将不胜感激。

void Scene::updateBoid()
{
    for(size_t i=0; i<m_collection.size(); ++i)
    {
        for(auto &m :m_collection[i])
        {
            m->acc = cohesion();

            m->pos += m->acc * 0.05f ;
        }
    }
}


Vec3 Scene::cohesion()
{
    const float pi = 3.14f;

    Vec3 center;
    Vec3 test;

    for(size_t i=0; i<m_collection.size(); ++i)
    {
        for(auto _m :m_collection[i]) // all of the boids
        {
            center += _m->pos;
        }

        center /= m_collection[i].size(); // doing this gives the center

        /// Boids move to the center of their average positions
        for(auto &m :m_collection[i])
        {
            m->dir =center - m->pos; //vector between the two objects

            m->dir.normalize();

            return m->dir;
        }
    }

}

cohesion()中的先前代码

        m->dir =center - m->pos;        //length between the two objects
        m->dir.normalize();
        m->pos+=m->dir * 0.25f; //speed

这可行,但是希望通过使用另一种方法来更新另一种方法。

2 个答案:

答案 0 :(得分:0)

在每次cohesion调用中,您总是(基本上)返回相同的方向,因此将所有m->acc设置为相同的值。那是因为您在return中的cohesion已经退出了第一个投标。

问题是您尚未决定cohesion应该做什么。如果应该返回一个物体的目标方向,则必须告诉它要考虑的物体。您也可以直接在m->acc中更新cohesion,而只需离开updateBoid来修改m->pos(并且仅读取m->acc-可能是更好的解决方案。

在代码中:


选项1:不返回任何内容。仅修改每个投标。不要只在cohesion内部调用updateBoid

void Scene::updateBoid()
{
    for(size_t i=0; i<m_collection.size(); ++i)
    {
        for(auto &m :m_collection[i])
        {
            float acc = m->dir;
            m->pos += acc * 0.05f;
        }
    }
}


void Scene::updateCohesion()
{
    for(size_t i=0; i<m_collection.size(); ++i)
    {
        // This must be in here, otherwise it will be slightly wrong later.
        Vec3 center;

        for(auto _m :m_collection[i]) // all of the boids
        {
            center += _m->pos;
        }

        center /= m_collection[i].size(); // doing this gives the center

        /// Boids move to the center of their average positions
        for(auto &m :m_collection[i])
        {
            m->dir =center - m->pos; //vector between the two objects

            m->dir.normalize();
        }
    }
}

选项2:返回每个boid的方向。这是低效的,因为您每次都需要重新计算中心。

void Scene::updateBoid()
{
    for(size_t i=0; i<m_collection.size(); ++i)
    {
        for(auto &m :m_collection[i])
        {
            float acc = cohesionForBoid(m_collection[i], m);
            m->pos += acc * 0.05f;
        }
    }
}

// What are these types? We don't know, that is missing from the question.
Vec3 Scene::cohesionForBoid(??? collection, ??? m)
{
    Vec3 center;

    for(auto _m : collection) // all of the boids
    {
        center += _m->pos;
    }

    center /= collection.size(); // doing this gives the center

    Vec3 dir = center - m->pos; //vector between the two objects
    dir.normalize();
    return dir;
}

答案 1 :(得分:0)

for(auto &m :m_collection[i])
{
    m->dir =center - m->pos; //vector between the two objects
    m->dir.normalize();
    return m->dir; // <- Always return on the first iteration
}

如Max Langhof所指出的,for循环仅执行一次。 我会称其为错误。首先修改您的代码。