【问题标题】:How to increment two different values with for loops in C++如何在 C++ 中使用 for 循环增加两个不同的值
【发布时间】:2016-10-17 10:37:03
【问题描述】:

目前我有这个:

Shape* shapeArray[12];
for (int i = 0; i < vertices.size(); i += 3) {
    for (int j = 0; j < sizeof(shapeArray) / sizeof(shapeArray[0]); j++) {
        shapeArray[j] = new Triangle(vertices[i], vertices[i + 1], vertices[i + 2], vec3(0.8, 0.0, 1.0));
    }
}

我正在尝试用三角形创建一个立方体。我想每次将 j 值增加 1 并将 i 值每次增加 3 导致这样的结果(如果它是硬编码的):

Shape* shapeArray[12];
shapeArray[0] = new Triangle(vertices[0], vertices[1], vertices[2], vec3(0.8, 0.0, 1.0));       
shapeArray[1] = new Triangle(vertices[3], vertices[4], vertices[5], vec3(0.8, 0.0, 1.0));       
shapeArray[2] = new Triangle(vertices[6], vertices[7], vertices[8], vec3(0.8, 0.0, 1.0));
shapeArray[3] = new Triangle(vertices[9], vertices[10], vertices[11], vec3(0.8, 0.0, 1.0));
shapeArray[4] = new Triangle(vertices[12], vertices[13], vertices[14], vec3(0.8, 0.0, 1.0));
shapeArray[5] = new Triangle(vertices[15], vertices[16], vertices[17], vec3(0.8, 0.0, 1.0));
shapeArray[6] = new Triangle(vertices[18], vertices[19], vertices[20], vec3(0.8, 0.0, 1.0));
shapeArray[7] = new Triangle(vertices[21], vertices[22], vertices[23], vec3(0.8, 0.0, 1.0));
shapeArray[8] = new Triangle(vertices[24], vertices[25], vertices[26], vec3(0.8, 0.0, 1.0));
shapeArray[9] = new Triangle(vertices[27], vertices[28], vertices[29], vec3(0.8, 0.0, 1.0));
shapeArray[10] = new Triangle(vertices[30], vertices[31], vertices[32], vec3(0.8, 0.0, 1.0));
shapeArray[11] = new Triangle(vertices[33], vertices[34], vertices[35], vec3(0.8, 0.0, 1.0));

但是,它并没有给我想要的结果。我得到了 3 个 j 值,因此没有正确绘制立方体。

如何使用 for 循环解决这个问题?或者我是否需要改变使用数组来存储三角形。谢谢。

【问题讨论】:

  • i 在你的 j 循环中没有改变;看起来你并不真的需要内部循环,但只需增加你想要设置的索引就可以了

标签: c++ arrays loops for-loop increment


【解决方案1】:

正如评论中指出的那样,您的内部循环不是必需的。

当你创建一个新的三角形时,你需要遍历数组并相应地计算顶点索引。

Shape* shapeArray[12];
for (int i = 0; i < vertices.size(); i += 3) {
        shapeArray[i] = new Triangle(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], vec3(0.8, 0.0, 1.0));
}

将是一个更简单且有效的实现。

【讨论】:

    【解决方案2】:
    for (int i= 0, j= 0; i < vertices.size(); i+= 3, ++j) {
    ...
    }
    

    这样的?

    【讨论】:

    • 从循环控制中删除i,只使用int i=j*3; 可能会更干净。
    • 我不认为这种“优化”会为人类可读性较差的代码付出代价。
    【解决方案3】:

    您可以更改您的 for 循环,以便 shapeArray 索引与顶点索引准确对应。我根据您的示例输出推断出这一点。

    Shape* shapeArray[12];
    for (int i = 0; i < vertices.size(); i += 3)
    {
    
        shapeArray[(int)i/3] = new Triangle(vertices[i * 3], vertices[i * 3 + 1], vertices[i * 3 + 2], vec3(0.8, 0.0, 1.0));
    
    }
    

    如果您将i 增加3,那么您将需要除以3 以获得shapeArray 索引。在这种情况下,您不需要内部循环。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2018-09-15
      • 2013-08-13
      • 2010-11-16
      • 2015-07-07
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多