根据成对点划分矩形

时间:2012-12-17 19:35:31

标签: c# algorithm math

Example http://xthlegion.co.uk/images/dividerectangle.png Example http://xthlegion.co.uk/images/dividerectangle2.png

如果您考虑上面的图像,您可以看到它们由一个大的矩形组成,该矩形按用户定义的坐标对分解成较小的矩形(示例图像中的每一对都用不同的颜色标识)。

我要做的是通过仅定义连接来获得这些矩形的坐标。边缘被视为显式连接。订单无关紧要。

有没有人知道执行此操作的算法的名称(我确定有一个名字很棒!)或者有一些示例C#代码?我一直在努力尝试这样做一段时间,但我没有成功。又一次全数学失败了!

更新
我想我会根据收到的评论快速更新这个问题。

  1. 线必须是直的,因此每对坐标将在一个轴上对齐
  2. 坐标必须从边缘或另一对的交点开始。第二个坐标必须以类似的方式结束。任何不开始/结束另一个连接的“孤儿”坐标都是非法的,我现在应该忽略它们,一旦我终于开始调整,应该可以进行抢断。
  3. 虽然在这个例子中,所有的对都或多或少地整齐地划分了矩形,但实际情况并非如此,并且可能有很多线创建了许多大小的矩形。
  4. 第二次更新 - 它有效:)
    Example http://xthlegion.co.uk/images/dividerectangle3.png

3 个答案:

答案 0 :(得分:5)

您尝试计算的内容为arrangement of line segments。 (这不是一个特别好的名字,但它似乎是我们坚持的名字!)计算它:

  1. 查找交叉点集(两个线段相交或交叉的所有点)。这可以通过Bentley–Ottmann algorithm来计算。如果有 n 行段和 k 交叉点,则需要O(( n + k )log 名词的)。 (但如果你只有几个线段,那么最好使用简单的O( n 2 )算法。)

  2. 通过一些额外的簿记,您可以记录每个交叉点的事件边缘,因此计算与您的线段对应的planar straight-line graph(PSLG)。

  3. 将PSLG转换为quad-edge data structure。这需要两个步骤。首先,通过按角度排列入射到每个顶点的边来在数据结构中找到边缘边连接。

  4. 选择尚未连接到两个面的边,在未连接面上创建面,然后绕过该面的边界,依次将其连接到每个边。重复,直到每个边连接到两个面。

  5. 一般情况下,这会产生除矩形以外的面(即使所有线段都是轴对齐且所有交叉点都有整数坐标),但也许在您的应用程序中这不会发生,或者您可以丢弃非长方形面孔。

答案 1 :(得分:2)

答案假设以下规则,我认为在任何情况下都是必要的:

用户只能使用水平线或垂直线细分现有的矩形。

这意味着在您的第一个示例中,细分的顺序必须是:
棕色,黄色,蓝绿色。

对于您正在使用的任何矩形类,定义两个扩展方法:SubdivideHorizontalSubdivideVertical,它们将接受细分的坐标,并将返回细分的两个结果矩形。 /> 对于您细分的每个矩形,将其替换为两个生成的细分矩形,并递归重复所有细分。

答案 2 :(得分:-1)

我会做以下事情。

  1. 在每个外部4个角上创建一个点。
  2. 在每个用户定义的点上创建一个点。
  3. 每当一条线越过一个空点时创建一个点。
  4. 穿过每个方格并检查四个角上是否有一个点。