0

我有一些用于绘制多边形边的代码,例如,在顶点为 0、1 和 2 的三角形中,边为 (0, 1)、(1, 2) 和 (2, 0)。我以为我可以这样完成:

for(size_t j = 0, k = 1; j <= vertices.size()-1; j++, k++){
 if(j == vertices.size()-1){k = 0;} //For j to k final edge
...
//draw edges, etc. 
...
}

...但这会使 k 值爆炸成无限循环。我已经看过了,并怀疑问题可能出在我的索引中,但是如果一切都取决于 j,我会认为可能是 vertices.size() 搞砸了。我在这段代码中遗漏了什么,还是应该更仔细地查看实际的顶点向量?

4

4 回答 4

6

你不需要计算 k :

size_t const count = vertrices.size()
for(size_t j = 0; j < count; j++) {
  size_t k = (j + 1) % count;
  // draw
}

这种方式kj+1除了当 j 是最大值时,在这种情况下它是 0。

于 2012-10-16T14:32:15.590 回答
2

如果您不确定vertices至少有一个条目,则减法vertices.size()-1可能会导致下溢(即减法中的值非常大size_t(0)-1),并且您的循环运行时间可能比您想要的长得多。

一个更惯用的解决方案是循环

for (size_t j = 0, k = 1; j < vertices.size(); j++, k++) {
 if ( j == vertices.size()-1) { //works, vertices has at least one entry
   k = 0;
 }
...
//draw edges, etc. 
...
}
于 2012-10-16T14:31:27.337 回答
2

如果向量“顶点”为空,则循环将近似为无限。您在条件中使用无符号整数算术,因此 -1 将是 0xFFFFFFF 或更大。

于 2012-10-16T14:32:50.677 回答
0

如果您在此处提供的所有内容均正确,则不会是无限循环。所以最好的答案是仔细检查你的代码的其他部分。

于 2012-10-16T14:33:29.543 回答