如何计算一组完全覆盖矩形孔矩形板的子矩形

时间:2012-09-18 10:06:40

标签: algorithm math geometry

说,我想从矩形板上划掉一些矩形孔。例如,

情况1,洞相交:

一个带有孔0,1,2的borad x,矩形0和1相交。

xxxxxxxxxxx
xxxxxx222xx
x000xx222xx
x00011222xx
x00011xxxxx
xxx111xxxxx
xxxxxxxxxxx

或更简单,情况2,没有孔相交:

xxxxxxxxxxx
xxxxx2222xx
x00xx2222xx
x00xx2222xx
x00x111xxxx
xxxx111xxxx
xxxxxxxxxxx

后者更像是“在一个大矩形内反转一组矩形”。

我的问题是:如何计算一组完全覆盖板x的子矩形?

Input: a larger rect, and a set of hole rects  
Output: a set of sub rects cover exactly the larger rect with holes  

rect结构可能如下面的CCRect,协调类型是float:

typedef struct {float x; float y;} CGPoint;
typedef struct {float width, float height} CGSize;
typedef struct {CGPoint origin; CGSize size;} CGRect;

有什么好主意吗?

1 个答案:

答案 0 :(得分:1)

您的问题中缺少约束。你想如何优化resutlt你想要尽可能少的矩形?

网格上有边缘吗?

我会这样做:

  • 从一个大矩形和两个方法开始,一个用于分割矩形,另一个用于连接它们
  • 将矩形的每一边的主矩形分成两部分。尽可能地扩展边界并沿着这条线分割平面。一旦你完成了这个,你就会得到许多小矩形。我想你想要尽可能少的矩形。
  • 传递一个 - 删除洞:对于每个小矩形,如果坐标填充在开头的一个洞矩形内,则将其丢弃。
  • 传递两个 - 加入剩余的矩形:对于每个矩形,如果它可以与邻居形成一个矩形,加入它们

这个第二关是棘手的,那里有很多优化。 一个简单的选择将是交替连接verticaly然后horizo​​ntaly。这样你就会得到更大的矩形。

编辑:
如果在传递1期间构建BSP树,则可以加速显着性传递2.每次分割时,它会创建一个新节点,其中2个叶子是子矩形。在第2阶段找到邻居会更快。