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

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)

这个问题给出两个长方形的坐标,问这两个长方形是否有重合部分。画出图来就是这样的:Screen-Shot-2015-07-17-at-17.13.49.png

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

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

现在重新看问题,似乎还是很复杂,难道要用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 )

是不是整洁多了?

转载于:https://www.cnblogs.com/programnote/p/4691608.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值