我正在研究2D自上而下的地图生成算法,其中我要创建的所有房间的顶部/左侧为Point,底部/右侧为Point.所有房间都是矩形的,除了某些偶尔共享的墙壁外,在任何部分都不会重叠.
我的问题是,当我有两个房间最终在它们之间共享一堵墙时,我如何快速,轻松地吐出由这两个墙内两个房间共享的“平铺”(或积分)列表?
我有点希望像:
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;
}
解决方法:
给定两个房间A和B:
我假设指定的点不包括房间的墙壁.如果不正确,则可以在第一步中跳过矩形填充.
将每个房间表示为矩形,该矩形在每个方向上延伸一个图块以说明墙壁:
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);