计算几个链接矩形周围的边界

时间:2008-11-14 10:59:53

标签: c++ graphics geometry

我正在开展一个项目,我需要围绕一组矩形创建边界。

让我们用这张照片作为我想要完成的事情的一个例子。

编辑:无法让图片代码正常工作,所以这里是完整的链接: http://www.flickr.com/photos/21093416@N04/3029621742/

我们有通过特殊链接矩形B链接的矩形A和C.您可以将其视为图形(A,C)中的两个节点以及它们之间的边缘(B)。这意味着矩形以下列方式具有彼此指针:A-> B,A< -B-> C,C-> B

每个矩形有四个顶点存储在一个数组中,其中索引0在左下角,索引3在右下角。

我想“遍历”这个链接结构并计算构成它周围边界(红线)的顶点。我已经有一些关于如何实现这一目标的小想法,但想知道你们中有些人在数学上倾向于在你的袖子上有一些巧妙的技巧。

我在这里发布这个的原因只是有人可能以前解决了类似的问题,并且有一些我可以使用的想法。我不指望任何人坐下来思考这个漫长而艰难的过程。在等待答案的时候,我打算在并行解决方案。

非常感谢任何输入。

6 个答案:

答案 0 :(得分:5)

使用这个例子,矩形彼此垂直,因此可以用四个值(两个x坐标和两个y坐标)表示:

   1   2   3   4   5   6

1  +---+---+
   |       |   
2  +   A   +---+---+
   |       | B     |
3  +       +   +---+---+
   |       |   |   |   |
4  +---+---+---+---+   +
               |       |
5              +   C   +
               |       |
6              +---+---+

1)将所有x坐标(左右)收集到一个列表中,然后对其进行排序并删除重复项

1 3 4 5 6

2)将所有y坐标(顶部和底部)收集到一个列表中,然后对其进行排序并删除重复项

1 2 3 4 6

3)通过唯一的y坐标之间的间隙数*创建一个二维数组*唯一的y坐标之间的间隙数。它只需要每个单元一位,所以在c ++中,向量< bool>可能会给你一个非常节省内存的版本

4 * 4

4)将所有矩形绘制到此网格中

   1   3   4   5   6

1  +---+
   | 1 | 0   0   0
2  +---+---+---+
   | 1 | 1 | 1 | 0
3  +---+---+---+---+
   | 1 | 1 | 1 | 1 |
4  +---+---+---+---+
     0   0 | 1 | 1 |
6          +---+---+

5)对于网格中的每个单元格,对于每个边缘,如果在该基本方向上旁边的单元格未绘制,则绘制该边缘的边界线


在这个问题中,矩形被描述为四个向量,每个向量代表一个角。如果每个矩形可以与其他矩形处于任意和不同的旋转,那么我上面概述的方法将不起作用。通过矢量图形光栅化器定期解决了在复杂多边形周围找到路径的问题,解决问题的一个好方法是使用像开罗这样的库来为你完成工作!

答案 1 :(得分:2)

此问题的一般解决方案是根据扫描线实现布尔运算。您可以找到一个简短的讨论here来帮助您入门。从文字:

“布尔算法的基础是扫描线。对于基本原则,本书:Computational Geometry an Introduction由Franco P. Preparata和Michael Ian Shamos非常好。”

我拥有这本书,虽然它现在在办公室,所以我无法查找你应该阅读的页码,虽然第8章关于矩形的几何形状可能是最好的起点。

答案 2 :(得分:1)

  1. 单独计算所有3个矩形的边界总和
  2. 计算A和B的重叠矩形,并从总和
  3. 中减去它
  4. 对B和C
  5. 的重叠矩形执行相同操作

    (从A和B得到重叠的矩形取中间的2个X位置,以及中间的2个Y位置)

    示例(x1,y1) - (x2,y2):

    • 矩形A:(1,1) - (3,4)
    • 矩形B:(3,2) - (5,4)
    • 矩形C:(4,3) - (6,6)

    计算:

    1. 10 + 8 + 10 = 28
    2. X coords ordered = 1,3,3,5中间两个是3和3
      Y coords顺序= 1,2,4,4中间两个是2和4
      所以:(3,2) - (3,4):boundery = 4
    3. X coords order = 3,4,5,6中间两个是4和5
      Y coords = 2,3,4,6中间两个是3和4
      所以:(4,3) - (5,4):boundery = 4
    4. 28 - 4 - 4 = 20
    5. 这是我的可视化示例:

         1   2   3   4   5   6
      
      1  +---+---+
         |       |   
      2  +   A   +---+---+
         |       | B     |
      3  +       +   +---+---+
         |       |   |   |   |
      4  +---+---+---+---+   +
                     |       | 
      5              +   C   +
                     |       |
      6              +---+---+
      

答案 3 :(得分:0)

一个简单的技巧应该是:

  1. 从第一个矩形
  2. 创建一个区域
  3. 将其他矩形添加到该区域
  4. 获取该地区的边界(不知何故?:P)

答案 4 :(得分:0)

经过一番思考后,我可能最终会做这样的事情:

伪代码:

 LinkRectsConnectedTo(Rectangle rectangle,Edge startEdge) // Edge can be West,North,East,South 
    for each edge in rectangle starting with the edge facing last rectangle
       add vertices in the edge to the final boundary polygon
       if edge is connected to another rectangle
          if edge not equals startEdge
             recursively call LinkRectsConnectedTo(rectangle,startEdge)

很明显,这段伪代码必须稍微改进一下,可能不会涵盖所有情况,但我想我可能已经解决了我自己的问题。

答案 5 :(得分:0)

我没有完全想到这一点,但我想知道你是否做不到这样的事情:

  • 列出所有边缘。
  • 获取P1.X = P2.X
  • 的所有边缘
  • 在该列表中,获取X相等的对
  • 对于每对,用一个或两个边缘替换它们不重叠的部分
  • 做一些聪明的事情以正确的顺序获得优势

你的矩形是否总是水平对齐,如果不是你需要做同样的事情,但对Y也是如此? 他们总是保证会感动吗?如果不是算法不会被破坏,但“正确的顺序”将无法定义。

相关问题