【问题标题】:Algorithm to get all the individual areas from a figure从图形中获取所有单个区域的算法
【发布时间】:2018-01-25 04:02:27
【问题描述】:

作为输入,我们只有一组段,这里是一个例子:

[AB] = [(0, 0), (0, 4)]    ;    [BC] = [(0, 4), (2, 6)]

[CD] = [(2, 6), (4, 0)]    ;    [DA] = [(4, 0), (0, 0)]

[CE] = [(2, 6), (5, 6)]    ;    [EF] = [(5, 6), (5, 3)]

[FG] = [(5, 3), (3, 3)]    ;    [HI] = [(2, 1), (4, 5)]

[JK] = [(1, 3), (2, 3)]    ;    [KL] = [(2, 3), (1, 1)]

[LJ] = [(1, 1), (1, 3)]

(对不起,我尽力了,但我的图像有点模糊)

我需要找到所有单独的区域。从上图中,我将有 3 个不同的区域,JKL、CEFG 和 {ABCD, JKL}:

注意不做任何区域的segment会被忽略(如[HI]),一个区域不能被segment分割,例如:

我可以用一些完全没有效率的意大利面条式代码轻松完成它,但在这样做之前,您对我可以开始研究的算法有任何想法吗?我正在寻找尽可能高效的东西......

【问题讨论】:

  • 线条是否有可能相交,例如如果 H 低于 AD 则 GH 与 AD 相交?
  • 找出所有连通图
  • “不能按段分割”是什么意思?
  • 我有几个段作为输入,这些段通过相互交叉创建了一些多边形。我的问题是让这些多边形形成的区域。 @m69 如果线相交它会创建一个新点([HG] 和 [AD] 的交点)。 @Singh 绝对不是一个独立的解决方案,但可能是一个好的开始,我会继续努力... @Surt 我的意思是,如果一个区域被一个段划分,我会单独保留 2 个子区域而不是一个

标签: algorithm performance area processing-efficiency


【解决方案1】:

想法:尝试从连接最少的节点创建最小的环。减少问题的规模。

  1. 删除只有一个段的所有节点,因为它们不能成为任何区域的一部分。
  2. 在段数之后按升序对节点进行排序(您需要 O(n log log n) 或更小的算法)
  3. 选择段数最少的节点
  4. flood fill 沿着段直到潜在目标已经被填充(不要向后退)
  5. ...(此处可能完成了 2 个以上的环)
  6. 通过删除连接到所选节点的 2 个分段节点获利
  7. 更新剩余的节点段。

ToDo:如果连接最少的节点是 3 或更高怎么办...

【讨论】:

  • 很好看的第一步!我认为这是一个好的开始,我们甚至可以通过循环这第一步来稍微改进它,直到没有更多的段可以被删除......但是在这里填充似乎不是一个好的选择,因为我们正在使用矢量元素而不是光栅图像...
  • 思路和 Dijkstra 一样,检查当前集合的闭合边。
猜你喜欢
  • 1970-01-01
  • 2017-04-21
  • 2014-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多