3

私が作成しているのは、上/左のポイントと下/右のポイントを持つ部屋だけである 2D トップダウン マップ生成アルゴリズムに取り組んでいます。すべての部屋は長方形で、時折壁を共有する場合を除いて、どの部分も重なっていません。

私の質問は、壁を共有する 2 つの部屋がある場合、壁内の両方の部屋で共有されている「タイル」(またはポイント) のリストをすばやく簡単に吐き出すにはどうすればよいですか?

私は次のようなことを望んでいます:

private List<Point> SharedTiles (Point P1, Point P2, Point P3, Point P4)
{
    /*
    P1 = Top Left point of room1
    P2 = Bottom Right point of room1
    P3 = Top Left point of room2
    P4 = Bottom Right point of room2
    */
    List<Point> _SharedTiles = new List<Point>();
    //Magic goes here...
    return _SharedTiles;
}
4

1 に答える 1

3

A と B の 2 つの部屋があるとします。

指定されたポイントには、部屋の壁は含まれていないと想定しています。これが正しくない場合は、最初のステップで四角形のインフレーションをスキップできます。

各部屋をRectangle、壁を考慮して各方向に 1 タイルずつ拡張された として表します。

var roomAreaA = new Rectangle(a1.X - 1, a1.Y - 1, (a2.X - a1.X) + 2, (a2.Y - a1.Y) + 2); 
var roomAreaB = new Rectangle(b1.X - 1, b1.Y - 1, (b2.X - b1.X) + 2, (b2.Y - b1.Y) + 2);

部屋の領域を交差させる:

var roomIntersection = Rectangle.Intersect(roomAreaA, roomAreaB);

結果の長方形は、2 つの部屋の領域間の交点を表します。部屋は壁のタイルのみを共有できると述べたので、必然的に、この交差領域のすべてのタイルが壁のタイルになります。

必要に応じて、この四角形をオブジェクトのリストに変換できPointます。これがどのように使用されているかによっては、以下の方法を必ずしもお勧めしませんが、要点を伝えています。

var p = from x in Enumerable.Range(r.X, r.Width)
        from y in Enumerable.Range(r.Y, r.Height)
        select new Point(x, y);
于 2012-09-12T20:08:53.710 に答える