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に少なくとも 1 つのエントリがあることを確認しないと、減算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 に答える