6

コリジョンマップと、光源になりたいところがあります。光源は、実際に地面が見える形の光を提供します。これで、次のようになります。

ここに画像の説明を入力してください

したがって、光は壁を通り抜けます。私はそれをこのように見せたい:

ここに画像の説明を入力してください

(壁との衝突を濃い黄色でマークしました)

そのため、壁に当たると光線は止まります。正しいライトの形を取得したいのですが、それを含むビットマップが最適です)

私の最初のアイデアは、光源から光線を投影し、それらが壁に衝突するタイミングを確認することでした(これを行う方法を知っています)が、たとえば0.001度ごとに光線を投影する必要があるため、光を生成するには時間がかかりすぎます。次のことは、ライトの形状が常に円であるとは限らないことです。場合によっては、楕円または半楕円、さらには三角形または円の一部になることもあります。一般的に、私は何も衝突しない光のビットビットを持っています、そしてそれを少し差し引いて、2番目の画像のように見せたいと思います。

そして最後に、Imはallegro 4.2.1を使用していますが、前述のすべてのビットマップは、0と1の2次元配列です。

助けてくれてありがとう、長い質問と私の悪い英語でごめんなさい。

4

3 に答える 3

7

基本的な考え方は、壁の影の領域を計算し、それに色を付けないことです。

この記事は、あなたにとって良いスタートになるはずです。

于 2012-05-22T13:12:07.323 に答える
2

MadKeithVソリューションにはO(ピクセル数^ 2)時間が必要です。

私の解決策は拡張されたMadKeithVのアイデアですが、O(ピクセル数)時間で実行されます。いくつかの改善により、O(光のピクセル数)で動作します

まず、光源を含むピクセルから始めます。次に、BFS手順を使用して、最も近いピクセルに光を「感染」させ、光が各ポイントから進むことができる方向の角度範囲を保存します。

次のBFSインスタンスでは、「感染範囲」のピクセルのみを考慮して、この手順を繰り返します。

于 2012-05-24T18:54:01.160 に答える
2

特定の例では、各(空の)ピクセルから光源の中心までの視線をチェックすることで、簡単にブルートフォースできます。視線があり、距離がフォールオフ内にある場合は、そこに光があります。そうでない場合は、暗いです。

于 2012-05-22T12:57:39.507 に答える