zoukankan      html  css  js  c++  java
  • 检查两个长方形是否有重叠部分

    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 )

    是不是整洁多了?

  • 相关阅读:
    HTML连载29-div和span标签
    Java连载14-补码简介&浮点型整数
    Java连载13-整数型字面值的强制转换
    Java连载12-继承开发环境&long类型
    [Python] tkinter 之 Listbox & Combobox
    [Python] Tkinter command
    [java] 转型
    [Python] execl读写
    [c++] 细节
    [刷题] PTA 7-64 最长对称子串
  • 原文地址:https://www.cnblogs.com/programnote/p/4691608.html
Copyright © 2011-2022 走看看