C++ 计算多个链接矩形周围的边界

C++ 计算多个链接矩形周围的边界,c++,graphics,geometry,C++,Graphics,Geometry,我正在做一个项目,我需要在一组矩形周围创建一个边界 让我们以这张图片为例来说明我想要实现的目标 编辑:无法使图像标记正常工作,因此以下是完整链接: 我们有两个矩形A和C,它们由一个特殊的链接矩形B链接。你可以将其视为图A、C中的两个节点,以及它们之间的边B。这意味着这些矩形有以下方式相互指向的指针:A->B、AC、C->B 每个矩形有四个顶点存储在一个数组中,其中索引0为左下角,索引3为右下角 我想遍历这个链接结构,并计算构成其周围边界红线的顶点。关于如何实现这一点,我已经有了一些小想法,但我

我正在做一个项目,我需要在一组矩形周围创建一个边界

让我们以这张图片为例来说明我想要实现的目标

编辑:无法使图像标记正常工作,因此以下是完整链接:

我们有两个矩形A和C,它们由一个特殊的链接矩形B链接。你可以将其视为图A、C中的两个节点,以及它们之间的边B。这意味着这些矩形有以下方式相互指向的指针:A->B、AC、C->B

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

我想遍历这个链接结构,并计算构成其周围边界红线的顶点。关于如何实现这一点,我已经有了一些小想法,但我想知道你们中一些更倾向于数学的人是否有一些巧妙的技巧

我在这里发布这篇文章的原因是,可能有人以前解决过类似的问题,并且有一些想法我可以使用。我不希望有人坐下来认真思考这个问题。我将在等待答案的同时,并行地研究一个解决方案


非常感谢您的任何意见。

一个简单的技巧应该是:

从第一个矩形创建一个区域 将其他矩形添加到区域 以某种方式获得该区域的边界?:P
一个简单的技巧应该是:

从第一个矩形创建一个区域 将其他矩形添加到区域 以某种方式获得该区域的边界?:P
经过一番思考,我最终可能会做这样的事情:

伪代码:

 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)

很明显,这段伪代码需要改进一点,可能无法涵盖所有情况,但我想我可能已经解决了自己的问题。

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

伪代码:

 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)

很明显,这段伪代码需要改进一点,可能无法涵盖所有情况,但我想我可能已经解决了自己的问题。

我还没有完全考虑到这一点,但我想知道您是否不能执行以下操作:

列出所有的边。 获取P1.X=P2.X的所有边 在该列表中,获取X相等的对 对于每一对,用一条或两条不重叠的边替换零件 做一些聪明的事情,使边缘按正确的顺序排列 你的矩形会一直水平对齐吗?如果不是的话,你需要做同样的事情,但是Y也一样?
他们总是保证会接触吗?如果不是这样的话,算法就不会被破坏,但是“正确的顺序”是不可定义的。

我还没有完全想清楚这一点,但我想知道你是否能做一些类似的事情:

列出所有的边。 获取P1.X=P2.X的所有边 在该列表中,获取X相等的对 对于每一对,用一条或两条不重叠的边替换零件 做一些聪明的事情,使边缘按正确的顺序排列 你的矩形会一直水平对齐吗?如果不是的话,你需要做同样的事情,但是Y也一样? 他们总是保证会接触吗?如果不是这样的话,算法就不会被破坏,但是“正确的顺序”是不可定义的

分别计算所有3个矩形的边界之和 计算A和B的重叠矩形,并从总和中减去它 对B和C的重叠矩形执行相同的操作 要从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 计算:

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

   1   2   3   4   5   6

1  +---+---+
   |       |   
2  +   A   +---+---+
   |       | B     |
3  +       +   +---+---+
   |       |   |   |   |
4  +---+---+---+---+   +
               |       | 
5              +   C   +
               |       |
6              +---+---+
分别计算所有3个矩形的边界之和 计算A和B的重叠矩形,并从总和中减去它 对B和C的重叠矩形执行相同的操作 要从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 计算:

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

   1   2   3   4   5   6

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

这个问题的一般解决方案是根据扫描线实现布尔运算。你可以找一个简短的讨论来开始。案文如下:

布尔算法的基础是s 坎琳。关于基本原则,佛朗哥P.普雷帕塔和迈克尔·伊恩·沙莫斯的书非常好


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

这个问题的一般解决方案是根据扫描线实现布尔运算。你可以找一个简短的讨论来开始。案文如下:

布尔算法的基础是扫描线。关于基本原则,佛朗哥P.普雷帕塔和迈克尔·伊恩·沙莫斯的书非常好


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

使用这个例子,其中矩形相互垂直,因此可由四个值表示,即两个x坐标和两个y坐标:

1 2 3 4 5 6 1 +---+---+ | | 2 + A +---+---+ | | B | 3 + + +---+---+ | | | | | 4 +---+---+---+---+ + | | 5 + C + | | 6 +---+---+ 1将所有左右x坐标收集到一个列表中,然后对其进行排序并删除重复项

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

1 3 4 5 6 1 2 3 4 6 3通过唯一x坐标之间的间隙数量*唯一y坐标之间的间隙数量创建二维阵列。它只需要每个单元一个比特,所以在C++中,一个向量可能会给你这个

的一个非常有效的内存版本。 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对于网格中的每个单元格,对于每条边,如果该基本方向上它旁边的单元格未绘制,请绘制该边的边界线


在问题中,矩形被描述为四个向量,每个向量表示一个角。如果每个矩形可以任意旋转,并且旋转角度与其他矩形不同,那么我上面概述的方法将不起作用。矢量图形光栅化器定期解决查找复杂多边形周围路径的问题,解决此问题的一个好方法是使用Cairo之类的库为您完成这项工作

使用示例,其中矩形相互垂直,因此可以由四个值表示,两个x坐标和两个y坐标:

1 2 3 4 5 6 1 +---+---+ | | 2 + A +---+---+ | | B | 3 + + +---+---+ | | | | | 4 +---+---+---+---+ + | | 5 + C + | | 6 +---+---+ 1将所有左右x坐标收集到一个列表中,然后对其进行排序并删除重复项

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

1 3 4 5 6 1 2 3 4 6 3通过唯一x坐标之间的间隙数量*唯一y坐标之间的间隙数量创建二维阵列。它只需要每个单元一个比特,所以在C++中,一个向量可能会给你这个

的一个非常有效的内存版本。 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对于网格中的每个单元格,对于每条边,如果该基本方向上它旁边的单元格未绘制,请绘制该边的边界线


在问题中,矩形被描述为四个向量,每个向量表示一个角。如果每个矩形可以任意旋转,并且旋转角度与其他矩形不同,那么我上面概述的方法将不起作用。矢量图形光栅化器定期解决查找复杂多边形周围路径的问题,解决此问题的一个好方法是使用Cairo之类的库为您完成这项工作

线总是垂直还是水平的?会有重叠吗?是的,会有重叠,这必须是它自己的情况。目前,这些线总是水平和垂直的。这些线总是垂直还是水平的?会有重叠吗?是的,会有重叠,这必须是它自己的情况。此时,线条将始终是水平和垂直的。矩形将始终接触,所有线条将是水平或垂直的。矩形将始终接触,所有线条将是水平或垂直的。嗯,在进一步思考之后,必须采取一些步骤来处理内环和重叠。这件事已经失控了。嗯,在进一步思考之后,必须采取一些措施来处理内部循环和重叠。这件事失去了控制。我投票支持这件事,因为我认为你在正确的轨道上。我投票支持这件事,因为我认为你在正确的轨道上。我不确定你试图用你的算法实现什么。它将如何帮助我围绕矩形创建边界多边形?在你的例子中,它由以下几点组成:1,1,3,1,3,2,5,3,6,3,6,6,4,4,1,4如果我数一数,它就是20,就像我计算的那样。如果你有不同的例子,请让我知道。我将解释如何计算这一个。我不确定你试图用你的算法实现什么。它将如何帮助我围绕矩形创建边界多边形?在你的例子中,其中包括以下几点:1,1,3,1,3,2,5,3,6,3,6,6,4,4,1,4如果我
是的,正如我计算的,是20。如果你有不同的例子,请让我知道。我将解释如何计算。我的同事同意这是解决我问题的最佳方法。我的同事同意这是解决我问题的最佳方法。