Algorithm 如何从矩形交点提取矩形
有一个矩形(a)并与另一个矩形(B)相交,如何提取通过该相交点(C、D、E&F)创建的其他矩形 这可以扩展到从几个交叉点提取矩形吗,比如这个例子,A与B&C交叉,提取D,E,F&GAlgorithm 如何从矩形交点提取矩形,algorithm,oop,math,Algorithm,Oop,Math,有一个矩形(a)并与另一个矩形(B)相交,如何提取通过该相交点(C、D、E&F)创建的其他矩形 这可以扩展到从几个交叉点提取矩形吗,比如这个例子,A与B&C交叉,提取D,E,F&G BBBBAAAAAAAAAA BBBBDDDDDDDDDD BBBBAAAAAAAAAA BBBBDDDDDDDDDD AAAAAACCCCCAAA -> EEEEEECCCCCFFF AAAAAACCCCCAAA EEEEEECCCCCFFF AAAAAAAAAAAAAA EEEEEE
BBBBAAAAAAAAAA BBBBDDDDDDDDDD
BBBBAAAAAAAAAA BBBBDDDDDDDDDD
AAAAAACCCCCAAA -> EEEEEECCCCCFFF
AAAAAACCCCCAAA EEEEEECCCCCFFF
AAAAAAAAAAAAAA EEEEEEGGGGGFFF
如果TJB问题的答案是肯定的,那么他们是: (左、上、右、下)符号 C=(A.左,A.上,B.左,A.下) D=(B.右,A.顶,A.右,A.底) E=(B.左,B.下,B.右,A.下)
E=(B.left,A.top,B.right,B.top)假设B完全包含在A中,它将类似于:
Rectangle[] GetSurrounding( Rectangle outer, Rectangle inner )
{
Rectangle left, top, right, bottom; // Initialize all of these...
left = new Rectangle( outer.Left, outer.Top, outer.Height, inner.Left - outer.Left );
top = new Rectangle( inner.Left, outer.Top, inner.Top - outer.Top, inner.Width );
// So on and so forth...
return new Rectangle[]{ left, top, right, bottom };
}
// This assumes:
Rectangle( x , y , height, width ); // Constructor
此外,决定是拉伸左矩形和右矩形的全高,还是拉伸顶部和底部矩形的全宽是任意的,并且需要是一个常量决定或方法的一个参数。其他情况下,矩形仅部分重叠,需要更多的逻辑查看最大/最小值,以检查是否超出范围等。如果A完全包含B:
Rectange C = new Rectangle(A.X,A.Y,B.X-A.X,A.Height);
Rectange D = new Rectangle(B.Right,A.Y,A.Right-B.Right,A.Height);
Rectange E = new Rectangle(B.X,B.Bottom,B.Width,A.Bottom-A.Bottom);
Rectange F = new Rectangle(B.X,A.Y,B.Width,B.Y-A.Y);
这是.NET,我不确定代码的语言,但我认为大多数结构在不同的语言中看起来是相似的,在.NET中,a的构造函数是(X,Y,Width,Height)对于更任意的形状,扫描线算法是可行的。根据水平扫描还是垂直扫描,您将得到不同的结果(您的示例与垂直扫描匹配)
基本上,您可以沿着每一列或每一行进行扫描,并将其划分为每个形状之间的间隔,下一列或下一行上具有相同起点和终点的间隔可以合并。给定一个大矩形,并从中冲出任意数量的小矩形,您可以使用贪婪算法将大矩形的剩余区域分割为较小的矩形
for all rectangles A
for all corners C of A
for all other rectangles B
if C is inside B
for all corners D of B
if D is inside A
got rectangle C-D
endif
endfor
endif
endfor
endfor
endfor
- 选择尚未覆盖的最左边、最上面的点
- 在那里开始一个矩形
- 尽可能向下延伸
- 然后将其向右延伸,直到可以移动为止
- 将该矩形添加到集合中,然后重复
第一步是最复杂的一步。如果你不介意一点随机性,一个更简单的方法是选择随机点,直到你找到一个尚未覆盖的点;然后向左走,直到你碰到一个边缘;然后上升,直到到达边缘。对于这个问题的一般解决方案(问题的后半部分),你应该使用a,它正好完成这一点(以及更多)。你是否假设B完全包含在a中?是的,它将被完全包含。问题的说明不清楚。为什么
B
(A的整个第一行)上面的整个空间不构成一个矩形,而左侧的整个空间(生成的C
矩形)构成一个矩形呢?这不是一个很好的问题:)最好是得到尽可能少的大矩形(大区域),而不是许多小矩形。我猜上面示例中的“算法”首先提取侧面的矩形,这导致了这个结果。理想的算法将测试不同的可能性并选择最佳的一个(=少数但较大的矩形)。如果TJB的问题的答案是否定的,则几乎是相同的:C和D分别存在于B.left>A.left或B.rightfor all rectangles A
for all corners C of A
for all other rectangles B
if C is inside B
for all corners D of B
if D is inside A
got rectangle C-D
endif
endfor
endif
endfor
endfor
endfor