有一个矩形(A)并与另一个矩形(B)相交,我怎样才能提取通过该交点(C,D,E& F)创建的其他矩形?
AAAAAAAAAAAAAA CCCFFFFDDDDDDD
AAABBBBAAAAAAA CCCBBBBDDDDDDD
AAABBBBAAAAAAA -> CCCBBBBDDDDDDD
AAAAAAAAAAAAAA CCCEEEEDDDDDDD
AAAAAAAAAAAAAA CCCEEEEDDDDDDD
并且可以扩展到从几个交叉点提取矩形,例如这个例子与A和B& C和提取物D,E,F& G'
BBBBAAAAAAAAAA BBBBDDDDDDDDDD
BBBBAAAAAAAAAA BBBBDDDDDDDDDD
AAAAAACCCCCAAA -> EEEEEECCCCCFFF
AAAAAACCCCCAAA EEEEEECCCCCFFF
AAAAAAAAAAAAAA EEEEEEGGGGGFFF
答案 0 :(得分:1)
如果对TJB问题的答案是肯定的,那么它们就是:
(左,上,右,下)符号
C =(A.left,A.top,B.left,A.bottom)
D =(B.right,A.top,A.right,A.bottom)
E =(B.left,B.bottom,B.right,A.bottom)
E =(B.left,A.top,B.right,B.top)
答案 1 :(得分:0)
假设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
此外,决定天气你拉伸左右矩形的全高或顶部和底部矩形的全宽是任意的,并且要么是一个恒定的决定,要么是方法的参数。矩形仅部分重叠的其他情况将需要更多逻辑来查看值的MAX / MIN以检查越界等。
答案 2 :(得分:0)
如果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中System.Drawing.Rectangle的构造函数是(X,Y) ,宽度,高度)
答案 3 :(得分:0)
对于更多任意形状,扫描线算法可以工作。根据您是水平扫描还是垂直扫描(您的示例与垂直扫描匹配),您将获得不同的结果
基本上你沿着每一列或每行扫描并将其分成每个形状之间的间隔,下一列的行间隔或具有相同开始和结束的行可以合并。
答案 4 :(得分:0)
如果有一个大矩形,其中有任意数量的较小矩形被打出,你可以使用贪婪算法将大矩形的剩余区域分解成更小的矩形。
不能保证产生最小数量的矩形。
第一步是最复杂的一步。如果你不介意一点随机性,那么更容易做的就是选择随机点,直到找到一个尚未覆盖的点;然后向左走,直到你到达边缘;然后一直走到你的边缘。
答案 5 :(得分:0)
对于此问题的一般解决方案(问题的后半部分),您应该使用corner-stitching data structure,这样做(以及更多)。
答案 6 :(得分:-1)
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