关闭多边形的算法

时间:2017-03-03 19:41:40

标签: algorithm geometry polygon shapely

我有一个多边形周长的一部分需要关闭它。请参考此图像image

正如我所看到的,只有一种独特的方法可以在不分割多边形且没有边相交的情况下关闭多边形。

关闭边缘将是b-> c,d-> e,f-> g,h-> a

有没有实现这一目标的算法?

我只能想到一种暴力方法,尝试每种可能的组合并检查它是否形成一个封闭的多边形(检查它是否为闭合多边形的任何好的算法?)

有没有更好的方法或已知的算法?

注意:顶点应仅由单条直线连接,而多边形不一定是凸面

此外,您可以放心地假设这些线段始终形成一个多边形,因为我从多边形中获取这些线段并且我试图重新创建多边形

2 个答案:

答案 0 :(得分:2)

我认为,在“表现良好”(小间隙,不太不规则形状等)的情况下,人们可能会采取以下方法。我们的想法是假设解决方案(输入线段的特定排列,然后假设与直线连接)最小化了定义感兴趣多边形边界的结果MultiLineString的长度。

为了解决这个问题,下面的实现使用2-opt启发式方法来解决旅行商问题。它按以下步骤进行:

  1. 顶点集被定义为所有输入线段的端点的并集
  2. 它尝试连接这些点,以便在属于同一输入线段的点始终连接的约束下最小化生成的MultiLineString的总长度(即,允许2-opt算法仅分割边缘连接不同的线段 - 这由主双public ApplicationUserManager(IUserStore<ApplicationUser> store) : base(store) { UserValidator = new UserValidator<ApplicationUser>(this) { AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true }; } - 循环中的额外if条件处理。
  3. 结果是:

    for

    对于您的输入(近似),结果确实如此: enter image description here

答案 1 :(得分:0)

这里可能有用的东西:
- 创建一个仅包含开放点的集合(仅在一条边上的点,即图中标记的点)
- 在该组上运行凸包算法 - 使用凸包的边缘来完成现有边的多边形。 (即,如果凸包含A-> B,但A和B已经通过预先存在的边缘组中的相邻边缘间接连接,则丢弃凸包中的边A-> B)

EDIT
我之前建议选择凸壳算法,但这种方法有缺点,包括点不会形成凸形的情况。

请注意,根据您的规定,有些集合没有解决方案,例如: enter image description here
(不能将它完成为没有交叉线的多边形,在开放点之间只使用一条直线)