检查两个长方形是否有重叠部分

Question: You are given two axis-aligned rectangles. You have to determine if these rectangles overlap each other or not.
Rectangle 1 : P1 (x, y), P2 (x,y)
Rectangle 2 : P3 (x, y), P4 (x,y)

这个问题给出两个长方形的坐标,问这两个长方形是否有重合部分。画出图来就是这样的:

问题似乎有点复杂,如果你找出了复杂的一组条件表达式,肯定用了不少力气。有个简单的办法,试着从反面看这个问题。

假设两个长方形分别有点(P1, P2)和点(P3, P4)表示。当两个长方体有重叠部分,肯定有一个长方体的一个角在另一个长方体的里面。看下面的图:

现在重新看问题,似乎还是很复杂,难道要用8个条件表达式来表示?能不能简化问题?

反面思考问题,袋子中有8个颜色各异的球,取不到黑球的概率是多少呢?我们先计算取出黑球的概率,在用1去减就行了。

同样,两个长方形怎样才能不重叠呢?答案很简单:当一个长方形在另一个长方形的上下左右的时候。

相应的条件表达式:

! ( P2.y < P3.y || P1.y > P4.y || P2.x < P3.x || P1.x > P4.x )

用De Morgan’s law简化一下:

( P2.y <= P3.y && P1.y >= P4.y && P2.x >= P3.x && P1.x <= P4.x )

是不是整洁多了?

posted @ 2015-07-31 11:03  programnote  阅读(2292)  评论(0编辑  收藏  举报