简单的分离转向

时间:2013-12-28 14:21:53

标签: java

我有一个java应用程序,可以创建150个随机宽度,高度,X和Y坐标的随机矩形。

大多数都是重叠的,这是我的问题。我想分开所有的矩形,但我不知道自己该做什么。 在这里,您可以看到rects的截图:

enter image description here

所有rects都存储在ArrayList(private ArrayList<DungeonCell> dungeonCells;)中 DungeonCell-Class类似于带有以下字段的向量:

public int positionX;
public int positionY;

public int width;
public int height;

我希望你能理解我的问题。

3 个答案:

答案 0 :(得分:3)

不要毫无顾虑地添加三角形,而是首先检查它是否合适。如果没有,请跳过它并创建另一个。这可以使用do-while

Rectangle r;
do
{
   r = createRandomRect();
} while (overlaps(r))
add(r);

注意:如果矩形数量不断增加且可用空间越来越小,这将会非常缓慢。还要确保矩形不占据整个区域。如果确实使用了所有空间,这个算法可能会失败,但这不太可能,因为我认为你使用浮点数。

答案 1 :(得分:1)

如果您想避免生成重叠的随机矩形,您可以这样做:

  • 生成下一个矩形的值
  • 检查新矩形的任何角落是否位于任何现有矩形内
  • 然后添加矩形或生成新的随机值
  • 不要忘记通过设置最大尝试次数来避免无限循环!

答案 2 :(得分:0)

如果您需要检查两个矩形是否相互交叉,则需要编写如下内容:

public static boolean Intersects(Rectangle rect1, Rectangle rect2)
{
    if (rect1.positionX >= rect2.positionX && 
rect1.positionY>=rect2.positionY && 
rect1.positionX <= rect2.positionX+rect2.height && 
rect1.positionY <= rect2.positionY + rect2.width 
  || rect1.positionX+rect1.height >= rect2.positionX 
&& rect1.positionY+rect1.width>=rect2.positionY 
&& rect1.positionX+rect1.height <= rect2.positionX+rect2.height 
&& rect1.positionY+rect1.width <= rect2.positionY + rect2.width)
        return true;
    else return false;
}