5

特定の角度で「角を切る」ことを可能にする特殊な線衝突アルゴリズムを作成する助けが必要です。

次の図で、青い四角がプレイヤーを表し、黒い四角が壁を表すとします。白い四角はプレイヤーの「視線」内の四角 (有効な四角) を表し、灰色の四角はプレイヤーの「視線」の外にある四角 (無効な四角) を表します。

img1

2 番目の画像は、手抜きを開始すると、より興味深いものになります。

img2

壁の角を通過しても許可されているこの線を詳しく見てみましょう。

img3

この行は次の理由で許可されています。

  • dx <= 0.5 (正方形が 1x1 の場合)
  • dx/dy は特定の比率を超えています (たとえば、2 - これらの画像で表されている正確な値はわかりません)。

(この場合は dy/dx の) 比率が低すぎるため、逆の行は許可されません。

img4

または、正方形からの入口と出口の角度について話すべきかもしれません....

私が抱えている主な問題は、グリッド上の 2 点間を任意の角度で移動するベクトルの解を一般化する方法がわからないことです。三角法を使用する必要があるかどうか、または何を使用するかを決定できません。これまでの私の最も近い解決策は、各正方形を dx および dy として線切片の小数部分を使用し、線の傾きとそれがどの象限にあるかに基づいて許可されているかどうかを確認することでした.

誰でも助けることができますか?

また、他の行アルゴリズムを借用したり、開始したりすることも検討しましたが、あまり有用なものは見つかりませんでした。私が見たそれらのほとんどは、(x1, y1) から (x2, y2) への線が (x2, y2) から (x1, y1) への線と同じであることを望んでいるため、この問題はまったく異なります。

4

1 に答える 1

1

円を使用することをお勧めします。それらは角に関して非常に最適です。

座標は各ピクセルの中心で取得されると想定しています。

(xo,yo) が (xa,ya) から (xb,yb) へのビューを隠しているかどうかを知るためのアルゴリズムは次のようになります。

  • (xa,ya) から (xb,yb) までの直線上の (xo,yo) に最も近い点 (xc,yc) を計算します。
  • (xo,yo) から (xc,yc) までの距離 d を計算する
  • d < 半ピクセルの場合、ビューは非表示になります

ポイントとラインの間の距離http://en.wikipedia.org/wiki/Distance_from_a_point_to_a_lineを直接計算することで最初の 2 つの段階を簡素化し、sqrt を避けたい場合は最終的に二乗距離を計算できます。

于 2013-08-22T12:32:02.220 に答える