Example http://xthlegion.co.uk/images/dividerectangle.png Example http://xthlegion.co.uk/images/dividerectangle2.png
如果您考虑上面的图像,您可以看到它们由一个大的矩形组成,该矩形按用户定义的坐标对分解成较小的矩形(示例图像中的每一对都用不同的颜色标识)。
我要做的是通过仅定义连接来获得这些矩形的坐标。边缘被视为显式连接。订单无关紧要。
有没有人知道执行此操作的算法的名称(我确定有一个名字很棒!)或者有一些示例C#代码?我一直在努力尝试这样做一段时间,但我没有成功。又一次全数学失败了!
更新
我想我会根据收到的评论快速更新这个问题。
第二次更新 - 它有效:)
Example http://xthlegion.co.uk/images/dividerectangle3.png
答案 0 :(得分:5)
您尝试计算的内容为arrangement of line segments。 (这不是一个特别好的名字,但它似乎是我们坚持的名字!)计算它:
查找交叉点集(两个线段相交或交叉的所有点)。这可以通过Bentley–Ottmann algorithm来计算。如果有 n 行段和 k 交叉点,则需要O(( n + k )log 名词的)。 (但如果你只有几个线段,那么最好使用简单的O( n 2 )算法。)
通过一些额外的簿记,您可以记录每个交叉点的事件边缘,因此计算与您的线段对应的planar straight-line graph(PSLG)。
将PSLG转换为quad-edge data structure。这需要两个步骤。首先,通过按角度排列入射到每个顶点的边来在数据结构中找到边缘边连接。
选择尚未连接到两个面的边,在未连接面上创建面,然后绕过该面的边界,依次将其连接到每个边。重复,直到每个边连接到两个面。
一般情况下,这会产生除矩形以外的面(即使所有线段都是轴对齐且所有交叉点都有整数坐标),但也许在您的应用程序中这不会发生,或者您可以丢弃非长方形面孔。
答案 1 :(得分:2)
答案假设以下规则,我认为在任何情况下都是必要的:
用户只能使用水平线或垂直线细分现有的矩形。
这意味着在您的第一个示例中,细分的顺序必须是:
棕色,黄色,蓝绿色。
对于您正在使用的任何矩形类,定义两个扩展方法:SubdivideHorizontal
和SubdivideVertical
,它们将接受细分的坐标,并将返回细分的两个结果矩形。 />
对于您细分的每个矩形,将其替换为两个生成的细分矩形,并递归重复所有细分。
答案 2 :(得分:-1)
我会做以下事情。