我正在寻找一种计算两个矩形之间差异的简单方法。我指的是属于其中一个矩形的所有点,但不是两个(所以它就像XOR)。
在这种情况下,矩形是轴对齐的,因此只有直角。我相信差异区域可以用0-4个矩形表示(如果两个矩形相同则为0,如果只有一个边缘不同则为1,一般情况下为4),我想将差异区域作为列表矩形。
您还可以将其视为移动/调整实体矩形时必须更新的屏幕区域。
示例:将矩形“a”的宽度加倍 - 我想要添加的区域(R)。
+----+----+
| a | R |
| | |
+----+----+
相交矩形(a和b) - 我希望T,L,R和B在矩形中给出的区域(可能的其他分区),但不包括X:
+------------+ a
| T |
|·····+------+-----+ b
| L | X | R |
| | | |
+-----+------+·····|
| B |
+------------+
我更喜欢python解决方案/库,但任何强大的算法都会有所帮助。
答案 0 :(得分:9)
将问题拆分为每轴。您的矩形可以根据每个轴上的跨度来定义 - 在每个轴上找到矩形开始或结束的有趣点,然后在这些术语中定义结果。这将为您提供6个不同区域的矩形,您可以轻松地将它们组合到您已经说明的四个区域,或者如果需要,可以消除退化的零区域矩形。
这是一个Java实现:
public class Rect
{
private float minX, maxX, minY, maxY;
public Rect( float minX, float maxX, float minY, float maxY )
{
this.minX = minX;
this.maxX = maxX;
this.minY = minY;
this.maxY = maxY;
}
/**
* Finds the difference between two intersecting rectangles
*
* @param r
* @param s
* @return An array of rectangle areas that are covered by either r or s, but
* not both
*/
public static Rect[] diff( Rect r, Rect s )
{
float a = Math.min( r.minX, s.minX );
float b = Math.max( r.minX, s.minX );
float c = Math.min( r.maxX, s.maxX );
float d = Math.max( r.maxX, s.maxX );
float e = Math.min( r.minY, s.minY );
float f = Math.max( r.minY, s.minY );
float g = Math.min( r.maxY, s.maxY );
float h = Math.max( r.maxY, s.maxY );
// X = intersection, 0-7 = possible difference areas
// h +-+-+-+
// . |5|6|7|
// g +-+-+-+
// . |3|X|4|
// f +-+-+-+
// . |0|1|2|
// e +-+-+-+
// . a b c d
Rect[] result = new Rect[ 6 ];
// we'll always have rectangles 1, 3, 4 and 6
result[ 0 ] = new Rect( b, c, e, f );
result[ 1 ] = new Rect( a, b, f, g );
result[ 2 ] = new Rect( c, d, f, g );
result[ 3 ] = new Rect( b, c, g, h );
// decide which corners
if( r.minX == a && r.minY == e || s.minX == a && s.minY == e )
{ // corners 0 and 7
result[ 4 ] = new Rect( a, b, e, f );
result[ 5 ] = new Rect( c, d, g, h );
}
else
{ // corners 2 and 5
result[ 4 ] = new Rect( c, d, e, f );
result[ 5 ] = new Rect( a, b, g, h );
}
return result;
}
}
答案 1 :(得分:1)
我会想象找到交叉矩形的区域(即X),并从矩形的组合区域中扣除a +矩形b将为您提供解决方案。
我发现这是为了寻找快速答案:
http://tekpool.wordpress.com/2006/10/12/rectangle-intersection-find-the-intersecting-rectangle/
答案 2 :(得分:0)
此链接中有一个算法: https://en.wikibooks.org/wiki/Algorithm_Implementation/Geometry/Rectangle_difference
它被称为“4区矩形差异”。
它基本上计算了从其他矩形中减去一个矩形后可能保留的四个可能的矩形。
在这种情况下,算法必须运行两次。