C 将矩形分割为更小重角的算法?

C 将矩形分割为更小重角的算法?,c,algorithm,C,Algorithm,用什么算法将一个矩形(cstruct和4ints)分成随机数个较小的矩形(返回一个structs列表)?如果较小矩形的最大和最小尺寸可以由参数控制,则效果更好 e、 g 较小的形状应为四边形,以下情况不好: +----------+ +-------+--+ | | | | | | | | | | | | --> |---+---

用什么算法将一个矩形(c
struct
和4
int
s)分成随机数个较小的矩形(返回一个
struct
s列表)?如果较小矩形的最大和最小尺寸可以由参数控制,则效果更好

e、 g

较小的形状应为四边形,以下情况不好:

+----------+            +-------+--+
|          |            |       |  |
|          |            |       |  |
|          |    -->     |---+---+--| (not good)
|          |            |          |
|          |            +---+      |
|          |            |   |      |
+----------+            +---+------+
谢谢

附录:(供白痴讨论的矩形)


将矩形一分为二。递归。

在一条边上选择一个随机点p,然后在那里用一条线将矩形分割到另一条边上。然后,您可以在两半上递归,随机停止递归或在指定的限制下停止递归。

在不指定分割矩形的条件下问这个问题有点奇怪

然而,我怀疑你要找的是kd树。kd树是一种二叉树,其中节点根据条件拆分为两个子节点。

还有一个四叉树,它的实现稍微简单一些。它包括将节点拆分为4个大小相等的子节点。以这种方式递归地分割每个子对象,直到出现某种停止条件。

[编辑:根据op的编辑进行更新。] 对于您正在做的事情,是否可以更简单地开始将矩形划分为一个均匀的网格,并决定合并哪些元素?基本上是一种自下而上的方法:只需选择一个,然后开始随机合并相邻单元。对于已经遍历的单元,不要这样做,合并的结构应具有宽度和高度,以便扩展2x1单元网格将扩展到2x2或3x1,以确保合并节点始终保持4边矩形形状


如果你想要一个更奇特的方法,你可以像kd树一样,自上而下地构建它,但在根据随机条件和最小/最大宽度/高度参数进行拆分时,你需要合并整个子树。

小矩形的结构有什么限制吗?我不用C编写代码,但在我看来,递归地将矩形划分为两个矩形就可以了。@而且较小矩形的大小应该受到上限和下限参数的限制,即不小于x轴上父矩形的%,不大于x轴上父矩形的%,不小于y轴上父矩形的%,不大于y轴上父矩形的%-axis@Horace:接受的答案遗漏了一些配置(请参阅我对该答案的评论)。大矩形中心的小矩形是否可以接受?您希望每个子矩形的数目都具有相同的概率,还是希望每个子矩形的配置都具有相同的概率?每个有效的配置都可能是可访问的吗?@amphetamachine:这里的结束条件非常明显,实际上不需要详细说明-毕竟,如果没有“0”或不能表示为整数的内容,就不能将“1”一分为二。@amphetamachine同意Anon。结束条件很明显。海报甚至指定矩形是由整数坐标指定的。这可能意味着所有内部矩形也应该具有整数坐标。Err。。这是行不通的。它遗漏了一些配置。有点像大通银行的标志,但最终形成了一个矩形。对不起,没有更好的描述,但我想你会得到这样的想法:在正方形中间的一个正方形,每个正方形的边都延伸到正好触及主矩形的一边。这就是你的意思吗?戴夫:这个答案在白痴反对之前就被接受了;这确实是错误的。此外,仅仅因为OP接受了答案并不意味着我们应该停止寻找更好(或正确)的答案,因为树和被接受的解决方案有同样的问题。考虑根节点。如果在x上分割,则有一条垂直线分割矩形。如果在y轴上分割,则有一条水平线分割矩形。事实上,这个解决方案与公认的没有太大区别。@笨蛋,我不知道这个解决方案的问题在哪里。请发布一个答案,用建议/接受的解决方案描述问题,并提供您自己的答案,忽略问题。我看不出问题所在,因为考虑到这个问题,我认为op永远不会想创造出与你描述的情况类似的东西。所以kd树对于他的目的来说已经足够了。@Dave:OP从来没有说过不需要附录中提到的矩形(但我想我们很快就会知道)。在任何情况下,此kd树解决方案都与公认的解决方案相同。实际上,就是将矩形一分为二并递归。对不起,除非我有答案,否则我不会发布,因此评论…每个理智的人都知道这两个答案的意思是一样的。既然op接受了这种解决方案,他似乎对其局限性感到满意。别抱怨了。感谢您选择您的用户名。@Dave。哦,求你了。。。无论如何,我不会再和你讨论了。毫无意义和浪费时间。
+----------+            +-------+--+
|          |            |       |  |
|          |            |       |  |
|          |    -->     |---+---+--| (not good)
|          |            |          |
|          |            +---+      |
|          |            |   |      |
+----------+            +---+------+
  +----+--------+
  |    |        |
  |    +---+----+
  |    |   |    | (rectangle-chase)
  +----+---+    |
  |        |    |
  +--------+----+