这些代码片段有什么区别?

时间:2013-05-17 21:57:49

标签: c++ algorithm vector geometry indices

以下代码片段是我尝试从索引和顶点获取三角形。 indices向量包含顶点的编号。 vertices向量包含坐标,其中三个构成一个顶点。三个顶点一起构成一个三角形。

第一个片段有效,但我不想使用其他向量。

vector<float> coords;
for(unsigned int i : indices)
{
    coords.push_back(vertices[3 * i + 0]);
    coords.push_back(vertices[3 * i + 1]);
    coords.push_back(vertices[3 * i + 2]);
}
for(unsigned int i = 0; i < coords.size(); i += 9)
{
    triangles->addTriangle(
        btVector3(coords[i + 0], coords[i + 1], coords[i + 2]),
        btVector3(coords[i + 3], coords[i + 4], coords[i + 5]),
        btVector3(coords[i + 6], coords[i + 7], coords[i + 8])
    );
}

第二个代码段不起作用,会导致访问冲突。

float coords[9];
for(unsigned int i = 0; i < indices.size(); i += 9)
{
    for(int n = 0, j = 0; j < 3; ++j)
        for(int k = 0; k < 3; ++k, ++n)
            coords[n] = vertices[3 * indices[i + n] + k];

    triangles->addTriangle(
        btVector3(coords[0], coords[1], coords[2]),
        btVector3(coords[3], coords[4], coords[5]),
        btVector3(coords[6], coords[7], coords[8])
    );
}

我没有发现差异。为什么第二个片段不起作用?

2 个答案:

答案 0 :(得分:2)

coords[n] = vertices[3 * indices[i + n] + k];

应该是

coords[n] = vertices[3 * indices[i + j] + k];

答案 1 :(得分:1)

您正在以i的步骤从0indices.size()重复i += 9,但访问indices[i + n]很可能超出界限。