Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何从矩形交点提取矩形_Algorithm_Oop_Math - Fatal编程技术网

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

Algorithm 如何从矩形交点提取矩形,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

有一个矩形(a)并与另一个矩形(B)相交,如何提取通过该相交点(C、D、E&F)创建的其他矩形

这可以扩展到从几个交叉点提取矩形吗,比如这个例子,A与B&C交叉,提取D,E,F&G

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.rightA.top)
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