在边界框碰撞中获取碰撞点

3
我正在研究一个二维自动生成地图算法,其中我只创建了一些具有左上角和右下角点的矩形房间。所有房间都是矩形的,除了一些偶尔共享墙壁外,不会重叠。
我的问题是,当我有两个房间最终共享它们之间的一堵墙时,如何快速轻松地输出在该墙内被两个房间共享的“瓷砖”(或点)列表?
我有种希望得到这样的东西:
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;
}
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);

哇,我甚至没有注意到Rectangle.Intersect在自身中输出了一个矩形。我只是假设它是一个布尔值。感谢您的帮助。 - Mythics
你并不完全错误。有一个非静态方法Intersects(),它返回一个布尔值,还有一个静态方法Intersect(),它返回交集矩形。这是一个微妙的区别!请注意,如果没有相交,Intersect()会返回一个空矩形。 - Cole Campbell
我太高兴了,有一个Rectangle.Intersect方法,我都快哭了。 - Big McLargeHuge

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接