【问题标题】:Get grids info (number and edges) given splitting line segments on a rectanglar page?获取矩形页面上给定分割线段的网格信息(数量和边缘)?
【发布时间】:2014-04-06 02:04:09
【问题描述】:

我正面临在矩形页面上给定分割线段的情况下查找网格信息(数量和边)的问题。以下图为例,所有分割线段均以红色圆圈表示,两端为红色圆圈,图中标注的数字为7。

假设:

  1. 线段构成矩形页面的有效分割。
  2. 所有最终网格都是四边形。
  3. 没有相交的线段(即认为在十字路口有一个额外的端点)。
  4. 没有线段位于另一个线段内。

当前解决方案:

  1. 在页面内随机选取一个点(之前未标记)。

  2. 遍历当前区域内的所有点,直到触及边界或分割线,并标记它们。当前区域是一个有效的网格。

  3. 循环步骤 1-2,直到标记所有点。

注意:这里我还假设整个页面可以离散为均匀的点(就像图像中的像素一样)。

问题和疑问:

上述解决方案的问题是我必须遍历页面内的所有点才能获得所有网格。有没有更简单的解决方案?

【问题讨论】:

  • 你的“页面”是什么,你是如何遍历你的点的? (你的领域是连续的吗?如果是,你是如何遍历的?)。你的线可以相交吗?它们可以是平行的还是位于另一个中(或多个嵌套案例)?
  • @AlmaDo 我忘了提到这里我还假设整个页面可以离散到统一的点(就像图像中的像素一样)。并且还假设没有相交的线,也没有人在另一条线上。
  • 那么如何仅顺时针遍历每个区域的顶点? (逆时针)直到回到同一点? (也可以记住访问点)
  • @AlmaDo 这个问题是如何确定何时转弯?
  • 你从拐角处开始。如果您面对顶点 - 尝试转身。始终朝着一个方向前进,您就会到达起点。

标签: algorithm graph-theory image-segmentation


【解决方案1】:

我终于通过分而治之找到了一个简单的方法。

理论依据: 添加一条线段会将当前区域分成两个网格。

根据上述,这个数字应该很简单,即number_line_segments+1。


为了确定每个网格的边缘,我们还需要知道添加新线段时分割哪个区域。

那么,问题就转化为:如何确定所有线段的有效相加序列(不唯一)。这里"valid"表示添加新线段时,会将当前区域分割成两个网格。

要确定所有线段的有效添加顺序,我只需要确定任意两个的顺序,可以如下确定:

order_for_two_line_segments(LineSeg LineSeg_A, LineSeg LineSeg_B)
{
    if (one of LineSeg_A's end points is on LineSeg_B)
        LineSeg_B should come before LineSeg_A;
    else if (one of LineSeg_B's end points is on LineSeg_A)
        LineSeg_A should come before LineSeg_B;
    else // neither end points of them are on the other one
        they can be in any order;
}

例如,在下图中(所有行都标记为L1-L6),L1 应该在L2 之前,因为L2 的终点之一在L1,没有它@987654330 @ 不能形成有效的拆分。 L2 和 L6 之间的任何顺序都可以是可能的,因为它们的两个端点都不在另一个端点上,这使得它们中的任何一个(没有另一个)仍然可以形成有效的拆分。

有效的添加序列可以是L3 > L1 > L2 > L5 > L4 > L6。


编辑:上述方法也适用于网格可以是任何形状的一般情况。

【讨论】:

    猜你喜欢
    • 2021-04-24
    • 1970-01-01
    • 2017-06-11
    • 2019-08-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    相关资源
    最近更新 更多