AABB長方形との線の交差?質問する

AABB長方形との線の交差?質問する

ゲームで使用するため、ループは使用しない方が望ましいです。

任意のサイズの長方形と線を交差させたいと思います。ただし、交差点も返されるようにしたいと思います。

可能性はあります。少しグーグルで調べてみましたが、まだわかりません。

線は (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長方形 (最初の画像で赤で表示) と交差しません。線が長方形と交差する可能性があるものについては、線と線の交差を試す必要があります。CDAB

セクションに番号/ラベルが付けられている方法により、x AND y != 0(各ラインのエンドポイントのセクションのラベルはどこにあるxy) を実行するだけで、交差がないかどうかを判断できます。

この方法を使用すると、線と線の交差が大幅に少なくなるため、全体の速度が大幅に向上します。

おすすめ記事