0

例

私はタイルエンジン(自作)を使用するプロジェクトに取り組んでおり、次のタスクはAIを作成することです(実行される他のAIに加えて)、AIはプレーヤーがAIの視界に。範囲(タイル単位)を計算した後までのサイクルで試してみました[1タイル= 32*32]。
それから、直線の方程式を作ることを考えました。そして、ここで私は数学に戸惑っています。

これらの「隠された」タイルの1つと重なっている場合、どのように計算できますか?
数学だけを使いたいことに注意してください!

TileInfo.tileData[la[floor(y / 32)][floor(x / 32)]];
//la -> array of tile positions, if it's >0 then there is a tile.
4

1 に答える 1

1

視聴者が位置(x1,y1)にあり、ターゲットがにあるとし(x2,y2)ます。今、私はに沿って、そしてに沿っnて隣接するタイルのセットがあると仮定しています。これらのタイルの最初の左下隅は、位置にあります。タイルのサイズはに沿っており、に沿っています。今数学:xmy(x0,y0)dxty

ビューアーとターゲットを結ぶ線は

y = y1 + (y2 - y1) * (x - x1) / (x2 - x1)

タイルの角はポイントにp1 = (x0,y0)あります; p2 = (x0 + n * d, y0); p3 = (x0 + n * d, y0 + m * t); p4 = (x0, y0 + m * t)。ここでの作業は、その線が2つの連続するコーナーを接続する4つのセグメントのいずれかと交差するかどうかを確認することです。で定義されたp1とp2(水平線)の間のセグメントを見てみましょうy = y0。これを線の方程式に設定すると、x私が名前を付けた可能性のある傍受を見つけることができますxi

y0 = (y2 - y1) * (xi - x1) / (x2 - x1) + y1

この方程式を逆にして、可能性を見つけることができます。

xi = x1 + (y0 - y1) * (x2 - x1) / (y2 - y1)

ここxi > x0xi < x0 + n * d、このセグメントのインターセプトがある場合。それ以外の場合は、自由な視線があります。

直線がp2 -> p3: x = x0 + n * d;で定義されている他の3つのセグメントについても同じようにします。p3 -> p4: y = y0 + m * d; およびp4 -> p1: x = x0

セグメントが水平(y = const)の場合、これyを見通し内直線に配置し、計算して切片xと比較する必要があることに注意してください。xセグメントが垂直(x = const)の場合xは、直線の方程式を入力し、計算yして、間隔内にあるかどうかを確認する必要があります。

x1 = x2最後に、またはの場合には特に注意する必要がありますy1 = y2。これは垂直方向と水平方向の視線であり、上記の式でゼロ除算につながる可能性があります。解決策:これらのケースを個別に処理します。

于 2012-08-25T20:59:40.627 に答える