【问题标题】:Break a rectangle into randomly shaped polygons将一个矩形分成任意形状的多边形
【发布时间】:2011-05-18 20:21:20
【问题描述】:

正如标题所说,我需要将一个矩形分成任意形状的多边形。

例如,有 7 个多边形:

+--------+--------+
|\       |   2    |
| \  1   |''--..__|
|  ------|  5     |
| 3  /   \________|
|   /    /\   6   |
|__/ 4  /  \______|
|      /  7       |
+-----+-----------+

我不知道是否已经有一种算法可以解决这个问题,但我似乎无法理解这一点。

我并不特别在意你用什么语言回答,但我会用 Java/Swing 来实现。

【问题讨论】:

  • 我不认为你的意思是“随机形状”的多边形;您示例中的那些多边形不是随机形状的。你的意思是你不关心多边形的形状吗?这与“随机形状”不同。
  • @McWafflestix:那么“随机形状”是什么意思?我的意思是,如果你多次运行这个算法,生成的多边形会有所不同。
  • "random" 暗示与集合的其他成员没有关系;对于以您指示的方式分解的矩形,一些成员与其他成员有关系(例如,共同的边长)。
  • @McWafflestix:我明白你现在的意思了。我的意思是随机的,因为每次运行算法时它们都应该有所不同,但一切都应该适合原始矩形。

标签: algorithm polygon shapes


【解决方案1】:

您可以在矩形上放置一堆随机点,然后计算 Voronoi 图。

Here is a Java/Swing implementation.

我做了一些示例(但using Mathematica,不是上面的实现)

HTH!

【讨论】:

  • +1 用于思考我的想法 :) 请注意,Voronoi 块是凸块,而原始示例有一些凹块。你可以随机合并几个 Voronoi 邻居来得到凹的。
  • @celion 我认为“随机形状”只是一个直观的概念……Voronoi 图提供了一个很好的游乐场,只需去除一些边缘即可获得奇怪的形状。 (ups!再次思考同样的问题:D)
  • 我们可以为每个多边形区域定义最小面积吗?
【解决方案2】:

我会在整个矩形上画出一堆随机线,然后在每个线的交叉点“分割”这些线,这样你基本上就有了某种线网。然后删除任意数量的随机线段,直到达到所需的多边形数量。

编辑:所以对于您的示例,添加行后会是这样:

+----+---+----+---+
|\'--.\_/|   /    |
| \    X |''/-..__|
|--\--+-\+-/------|
|___\/___\/_______|
|   /\   /\       |
|__/__\_/|_\______|
| /    X |  \     |
++----+-++---+----+

【讨论】:

  • 这让我想起了fault algorithm 的二维版本。
  • 我看到的问题是很难以编程方式确定要删除哪些行。此外,这有可能生成微小的多边形,如果可能的话,我想避免这种情况。
  • 我不知道故障算法,但是是的,确实非常相似!
  • Austin,添加的线越少,多边形就越大。至于要删除哪些线段,请在需要时使用规则集随机选取它们(例如仅从接触边界的多边形中删除线),或按多边形大小选取它们(例如从最小的接触多边形表面选取线)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 2015-09-09
  • 1970-01-01
相关资源
最近更新 更多