1

2D マップがあり、線が要素と衝突するかどうかを確認したい。線が途中でオブジェクトと交差するかどうかを教えてくれる関数が必要です。

見てみましょう:

ここに画像の説明を入力

赤い線は正しくありません (関数は false を返す必要があります)、緑の線は (true を返す) です。私のコリジョン マップは、壁が 1、空きスペースが 0 のブール値のマップです。

どうやってこれに?線が壁と交差しているかどうかを確認する必要があることを読みましたが、2D マップでこれを行う方法がまったくわかりません。

返信ありがとうございます。

4

3 に答える 3

3

壁がどのように表現されるかによって異なります。

それらが長方形の場合は、線と長方形を表す 4 つのセグメントの間の線/セグメントの交点を探します。

それらがピクセルである場合、ブレゼンハム ラインアルゴリズムを使用して、ライン上のピクセルがこれらのブロック上にあるかどうかを確認できます。

于 2012-05-22T18:20:25.747 に答える
1

壁が線分として表されている場合、Paul Bourke が説明しているように、線分の交差をテストできます: http://local.wasp.uwa.edu.au/~pbourke/geometry/lineline2d/

壁がポリゴンとして表されている場合は、壁のポリゴンに対してテスト ラインをクリップし、Paul Bourke が説明しているように、クリッピングの結果が空でないかどうかを確認できます: http://local.wasp.uwa.edu.au/~pbourke/geometry /cliplinetopoly/

于 2012-05-22T18:38:32.123 に答える
-1

だから、私はあなたの細胞が正方形であると想像しました...それらが単位正方形であるとしましょう。したがって、 float または double である のようなポイントの座標がある場合、それらは cell にあります。

  1. どのセルが線の終点であるかを知る必要があります
  2. 端点から端点までまっすぐ歩き、セルごとに壁かどうかをテストします
  3. 壁が見つかった場合は false を返し、それ以外の場合は true を返します。

あるエンドポイントから別のエンドポイントまで歩くには、各軸のデルタを計算する必要があります (delta_x と delta_y を呼び出します。ここではセルについて話しているため、これらの値は「int」です)。つまり、垂直方向に移動するセルの数と、水平に。あなたは2つのうち最大のものを取ります。その最大値をループに使用します。この値が D = max(delta_x, delta_y) であり、XX と YY が 1 つのエンドポイントのセルの座標であるとしましょう。

float step = 1.0f / D;
float current_location = 0.0;
for (int i = 0; i <= D; ++i, current_location += step)
{
  int cur_x = XX + current_location * delta_x;
  int cur_y = YY + current_location * delta_y;
  if (intersect_wall(cur_x, cur_y))
    return false;
}
return true;

それだけです...これをあなたの機能に適応させてください。

于 2012-05-22T18:26:52.867 に答える