我需要为测试目的创建一组(大)空间多边形。是否有一种算法可以创建一个随机形状的多边形,使其保持在边界包络内?我正在使用 OGC Simple 的东西,所以创建众所周知的文本的例程是最有用的,选择的语言是 C#,但它并不那么重要。
问问题
2067 次
3 回答
1
你的边界信封是什么形状?如果它是一个矩形,则将随机多边形生成为 [0,1]x[0,1] 内的点列表,并缩放到矩形的大小。
如果信封不是矩形,事情就会变得更加棘手。在这种情况下,您只需在单位正方形内生成点并拒绝位于单位正方形部分中的任何不缩放到您选择的边界包络的点,您就可以获得最佳性能。
高温高压
标记
补充
如果您只想要凸多边形,则可以使用其中一种凸包算法。由于您似乎不只想要凸多边形,因此您对圆形扫描的建议会起作用。
但是您可能会发现沿着平行于 x 轴或 y 轴的线进行扫描更简单。假设 x 轴。
- 将点按 x 顺序排序。
- 选择最左边(即第一个)点。在该点的 y 坐标处,在单位正方形上画一条假想的水平线。准备沿假想线上方的多边形边界创建一个点列表,并沿其下方的边界创建另一个列表。
- 选择下一个点。将其添加到由它的 y 坐标确定的上边界或下边界列表中。
- 继续,直到你没有积分。
这将生成凸多边形和非凸多边形,但非凸多边形的形式相当有限。没有入口或曲折。
另一个想法
为了避免边缘交叉并避免在单位正方形内生成随机点后进行圆形扫描,您可以:
- 在极坐标的单位圆内生成随机点,即(r, theta)。
- 按 theta 顺序对点进行排序。
- 转换为笛卡尔坐标。
- 将单位圆缩放到您选择的边界椭圆。
在我的脑海中,这似乎工作正常
于 2010-01-07T11:18:20.643 回答
1
他们真的需要是随机的,还是一些真正的 WKT 会这样做?因为如果可以,只需访问http://koordinates.com/并下载几层。
于 2010-01-07T11:51:09.550 回答
1
在这里,您可以找到两个如何生成随机凸多边形的示例。它们都在 Java 中,但应该很容易将它们重写为 C#:
- 从 Sun生成多边形示例
- 来自JTS邮件列表,由 Michael Bedward 发布最小面积边界框
另一种可能的方法是基于生成随机点集并采用Delaunay细分。
通常,生成适当的随机多边形的问题并非易事。
于 2010-01-24T16:11:33.823 回答