ゲームで使用するため、ループは使用しない方が望ましいです。
任意のサイズの長方形と線を交差させたいと思います。ただし、交差点も返されるようにしたいと思います。
可能性はあります。少しグーグルで調べてみましたが、まだわかりません。
線は (x1,y1,x2,y2) を使用して定義されます。長方形にもこれらの 2 つの点があります。
ベストアンサー1
長方形を構成する各線分 (エッジ) に対して、線分と線分の交差チェックを実行することをお勧めします。以下は、私がかなり前に書いた、古い XNA プロジェクトの 1 つから掘り出した線分の交差検出アルゴリズムです。
// a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end
static bool Intersects(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2, out Vector2 intersection)
{
intersection = Vector2.Zero;
Vector2 b = a2 - a1;
Vector2 d = b2 - b1;
float bDotDPerp = b.X * d.Y - b.Y * d.X;
// if b dot d == 0, it means the lines are parallel so have infinite intersection points
if (bDotDPerp == 0)
return false;
Vector2 c = b1 - a1;
float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp;
if (t < 0 || t > 1)
return false;
float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp;
if (u < 0 || u > 1)
return false;
intersection = a1 + t * b;
return true;
}
上記の方法に各エッジを入力して結果を収集する作業を、読者の皆さんの練習として残しておきます :)
編集 1年後、私は大学に進学し、グラフィックスのコースを受講しました。
見てみましょうコーエン・サザーランドアルゴリズム多数の線があり、そのほとんどが長方形と交差していない場合に、これを効率的に実行します。9 セグメントのグリッドを使用し、線の各端点をそのグリッドの領域に配置します。
これを使用すると、線の交差がないかどうかがわかります。
たとえば、ここではとは両方とも一番上の行にあり、 も ではないため、 はCD
長方形 (最初の画像で赤で表示) と交差しません。線が長方形と交差する可能性があるものについては、線と線の交差を試す必要があります。C
D
AB
セクションに番号/ラベルが付けられている方法により、x AND y != 0
(各ラインのエンドポイントのセクションのラベルはどこにあるx
かy
) を実行するだけで、交差がないかどうかを判断できます。
この方法を使用すると、線と線の交差が大幅に少なくなるため、全体の速度が大幅に向上します。