如何从矩形交叉点提取矩形

时间:2010-02-01 10:46:09

标签: algorithm oop math

有一个矩形(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

7 个答案:

答案 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