2012-09-12 35 views
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; 
} 

回答

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

哇,我甚至沒有注意到Rectangle.Intersect本身吐出一個矩形。我只是假設它是一個布爾值。謝謝您的幫助。 – Mythics

+0

你並不完全錯誤。既有一個非靜態方法'Intersects()',它返回一個布爾值,還有一個靜態方法'Intersect()',它返回相交矩形。一個微妙的區別!請注意,如果沒有交集,'Interesect()'將返回一個空矩形。 –

+0

+1000。我很高興有一個我可以哭的「矩形。交互式」方法。 –