我面临的问题是在矩形页面上分割线段时找到网格信息(数字和边缘)。以下图为例,所有分割线段都显示为两个端点为红色圆圈,此处的数字将为 7
,如图所示。
假设:
当前解决方案:
随机选择页面内的一个点(之前未标记)。
遍历当前区域内的所有点,直到触摸边框或分割线并标记它们。当前区域是有效网格。
循环步骤1-2,直到所有点都被标记。
注意:这里我还假设整个页面可以是离散的均匀点(就像图像中的像素一样)。
问题&问题:
上述解决方案的问题是我必须遍历页面中的所有点才能获得所有网格。有没有更简单的解决方案?
答案 0 :(得分:2)
我终于通过分而治之找到了一个简单的方法。
基于理论: 添加线段会将当前区域拆分为两个网格。
根据以上所述,该数字应该非常简单,即 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
,如果L2
无法形成有效的拆分。任何订单都可以在L2
和L6
之间进行,因为它们的两个端点都不在另一个端点上,这使得它们中的任何一个(没有另一个)仍然可以形成有效的分割。
有效的添加顺序可以是L3 > L1 > L2 > L5 > L4 > L6
。
编辑:上述方法也适用于网格可以是任何形状的一般情况。