我正在制作一个2D自上而下的地图生成算法,我正在创建的所有房间都有一个顶部/左侧的Point和一个底部/右侧的Point。所有房间都是长方形,除了偶尔共用墙壁外,不会在任何部分重叠。
我的问题是,当我有两个房间最终在它们之间共用一面墙时,我如何快速轻松地吐出所有墙内两个房间共享的“瓷砖”(或点)列表? / p>
我有点希望得到类似的东西:
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;
}
答案 0 :(得分: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);