視聴者が位置(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 > x0でxi < 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。これは垂直方向と水平方向の視線であり、上記の式でゼロ除算につながる可能性があります。解決策:これらのケースを個別に処理します。