私はC ++でトロイダル2Dグリッド(つまり、側面でラップアラウンド)で作業していて、明らかなネイバー/相対ポイント関数を作成しました:
point neighbor(point p0, int dx, int dy)
{
point p=p0;
p.x += dx;
p.y += dy;
p.x %= width; if(p.x<0) p.x += width;
p.y %= height; if(p.y<0) p.y += height;
return p;
}
この関数の実装は些細なことのように思えたので、なぜ自分のプログラムが機能しないのかまったくわかりませんでした。
% 演算子は理解できたと思いますが、否定的な結果をチェックすることさえ覚えていました。それでも、私はそれを試し始めました。「幅」は値が160の符号なしだったので、試しました:
cout << (-1) % 160u;
...そして95という結果を見てショックを受けました。
一体何が起こっているのですか?