3

我正在研究一种 2D 自上而下的地图生成算法,我所创建的只是具有顶部/左侧点和底部/右侧点的房间。所有房间都是矩形的,除了一些偶尔共用墙壁外,任何部分都没有重叠。

我的问题是,当我有两个房间最终在它们之间共享一堵墙时,我将如何快速轻松地吐出由所述墙内的两个房间共享的“瓷砖”(或点)列表?

我有点希望像:

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:

我假设指定的点不包括房间的墙壁。如果这是不正确的,您可以在第一步中跳过矩形膨胀。

将每个房间Rectangle表示为在每个方向上延伸一格以解释墙壁:

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);

生成的矩形将表示两个房间区域之间的交集。既然你说房间只能共享墙砖,那么必然会得出这个交叉区域的所有瓷砖都是墙砖。

如有必要,您可以将此矩形转换为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 回答