如何用非交叉旋转矩形填充矩形区域?

时间:2012-05-25 10:02:28

标签: algorithm geometry 2d

我尝试为物理模拟创建场景。场景由漂浮在矩形池塘中的矩形浮体组成。像这样:

Rectangular floes

所以我需要用一个非交叉的旋转矩形填充一个矩形区域,其宽度和高度在指定的范围内。我不需要找到该区域的最佳覆盖范围。目标只是在没有交叉点的情况下生成不同大小的浮体。

我想获得一个没有任何动态的解决方案,只使用碰撞检测算法。

3 个答案:

答案 0 :(得分:2)

你可以考虑模拟落入方形桶的盒子集合,并在它们休息后保存所有盒子的位置。

box2d是一个开源的2D物理库,它可以为你做到这一点 - 你可能会认为它是“愤怒的小鸟”背后的物理引擎和数以万计的Flash游戏。

答案 1 :(得分:1)

要模拟实体(即非交叉)对象,可以使用物理引擎。碰巧我前几天阅读Farseer tutorial for the absolute beginners,其中包含一个几乎完全描述您需求的视频。 Farseer是box2d的.NET版本,您可能已经听说过。

答案 2 :(得分:1)

我会做的事情:

假设矩形的长度在[MaxSize MinSize]

之间
r <- MaxSize

do{
  Trying adding non-intersecting circles to the area with radius r and random center (x,y). We use circle instead of rectangle because intersection detecting for circles are easier than rectangles. e.g. if distance(x,y,x',y')<r+r' then we are good.

  If adding circle failed{
    r--;
    if r< MinSize break;
  }
}

现在你将有一个相交正方形的飞机。因为我们使用圆作为交叉检测,所以会有间隙。如果这对您来说不够好,请将正方形增长为矩形。你可以通过检查某个边界的所有点来确定你可以增长多少。