代码之家  ›  专栏  ›  技术社区  ›  smilingpoplar

如何计算一组正好覆盖有矩形孔的矩形板的子矩形

  •  2
  • smilingpoplar  · 技术社区  · 13 年前

    比方说,我想从一块长方形的木板上刮下一些长方形的洞。例如

    情况1,孔相交:

    一个硼砂,里面有孔0,1,2,矩形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 回复  |  直到 13 年前
        1
  •  2
  •   bokan    3 年前

    你的问题缺少约束。您希望如何优化结果。你是否希望得到尽可能少的矩形?

    边缘在网格上吗?

    我会这样做:

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

    这第二关很棘手,需要进行大量优化。 一个简单的选择是交替地垂直连接,然后水平连接。这样你会得到更大的矩形。

    编辑:
    如果你在通行证1期间建造了一棵BSP树,你可以加速戏剧性的通行证2。每次拆分时,它都会创建一个新节点,其中2个叶子是子矩形。这将使在通道2中查找邻居的速度更快。