Algorithm 获取矩形页面上给定分割线段的网格信息(数量和边)?

Algorithm 获取矩形页面上给定分割线段的网格信息(数量和边)?,algorithm,graph-theory,image-segmentation,Algorithm,Graph Theory,Image Segmentation,我面临一个问题,在矩形页面上找到给定分割线段的网格信息(数量和边)。以下图为例,所有分割线段的两个端点均显示为红色圆圈,此处的数字将为图像中标注的7 假设: 线段构成矩形页面的有效分割 所有最终网格均为四边形 无交叉线段(即,在交叉点上有一个额外的端点) 没有线段位于另一条线段内 当前解决方案: 在页面内随机选择一个点(之前未标记) 遍历当前区域内的所有点,直到触及边界或分割线,并对其进行标记。当前区域是有效的栅格 循环步骤1-2,直到所有点都已标记 注意:这里我还假设整个页面可以离散成统一的

我面临一个问题,在矩形页面上找到给定分割线段的网格信息(数量和边)。以下图为例,所有分割线段的两个端点均显示为红色圆圈,此处的数字将为图像中标注的
7

假设:

  • 线段构成矩形页面的有效分割
  • 所有最终网格均为四边形
  • 无交叉线段(即,在交叉点上有一个额外的端点)
  • 没有线段位于另一条线段内
  • 当前解决方案:

  • 在页面内随机选择一个点(之前未标记)

  • 遍历当前区域内的所有点,直到触及边界或分割线,并对其进行标记。当前区域是有效的栅格

  • 循环步骤1-2,直到所有点都已标记

  • 注意:这里我还假设整个页面可以离散成统一的点(就像图像中的像素)

    问题与疑问:


    上述解决方案的问题是,我必须遍历页面中的所有点,以获得所有网格。有更简单的解决方法吗?

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

    理论依据:添加线段将当前区域分割为两个网格

    基于上述情况,数字应该非常直接,即
    数字线段+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
    上,没有它,
    L2
    就不能形成有效的分割。而
    L2
    L6
    之间可以有任何顺序,因为它们的两个端点都不在另一个端点上,这使得它们中的任何一个(没有另一个)仍然可以形成有效的分割

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



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

    什么是您的“页面”以及如何遍历点?(你的场地是连续的吗?如果是,你是如何穿越的?)。你的线能相交吗?它们是平行的还是相互重叠的(或多个嵌套的情况)?@AlmaDo我忘了在这里提到,我还假设整个页面可以离散到统一的点(就像图像中的像素一样)。也假设没有相交的线,也没有一条在另一条上。那么,顺时针只遍历每个区域的顶点怎么样?(逆时针)直到回到同一点?(还有记住到访点)@AlmaDo这方面的一个问题是如何确定何时转弯?从拐角处开始。若你们面对顶点,试着转向。总是朝着一个方向前进,你们就会到达起点。