java 判断两个矩形是否重叠(Find if two rectangles overlap)

给定两个矩形,判断这两个矩形是否重叠。
注意,一个矩形可以用两个坐标表示,左上角和右下角。所以我们主要给出以下四个坐标。
l1 :第一个矩形的左上角坐标。
r1 :第一个矩形的右下角坐标。
l2 :第二个矩形的左上角坐标。
r2 :第二个矩形的右下角坐标。

我们需要编写一个函数bool doOverlap(l1, r1, l2, r2),如果两个给定的矩形重叠,则返回 true。

注意:可以假设矩形与坐标轴平行。
一种解决方案是逐个选取一个矩形的所有点,然后查看该点是否位于另一个矩形内。这可以使用以下文章讨论的算法来完成。

JavaScript 如何检查给定点是位于多边形内还是外:JavaScript 如何检查给定点是位于多边形内还是外(How to check if a given point lies inside or outside a polygon)-CSDN博客
C# 如何检查给定点是位于多边形内还是外:C# 如何检查给定点是位于多边形内还是外(How to check if a given point lies inside or outside a polygon)-CSDN博客
python 如何检查给定点是位于多边形内还是外:python 如何检查给定点是位于多边形内还是外(How to check if a given point lies inside or outside a polygon)-CSDN博客
java 如何检查给定点是位于多边形内还是外:java 如何检查给定点是位于多边形内还是外(How to check if a given point lies inside or outside a polygon)-CSDN博客
C++ 如何检查给定点是位于多边形内还是外:C++ 如何检查给定点是位于多边形内还是外(How to check if a given point lies inside or outside a polygon)_c++判断一个点是否在多边形内部-CSDN博客

以下是一种更简单的方法。如果以下条件之一为真,则两个矩形不重叠。

1 ) 一个矩形位于另一个矩形的上边缘上方。

2 ) 一个矩形位于另一个矩形左边缘的左侧。我们需要检查上述情况以确定给定的矩形是否重叠。

以下是上述方法的实现:

public class RectangleOverlap {

    static class Point {

        int x, y;
        
        Point(int x, int y) {

            this.x = x;

            this.y = y;
        }
    }

    // Returns true if two rectangles (l1, r1) and (l2, r2) overlap
    static boolean doOverlap(Point l1, Point r1, Point l2, Point r2) {

        // If one rectangle is to the left of the other
        if (l1.x > r2.x || l2.x > r1.x)
            return false;

        // If one rectangle is above the other
        if (r1.y > l2.y || r2.y > l1.y)
            return false;

        return true;
    }

    public static void main(String[] args) {

        Point l1 = new Point(0, 10);

        Point r1 = new Point(10, 0);

        Point l2 = new Point(5, 5);

        Point r2 = new Point(15, 0);

        if (doOverlap(l1, r1, l2, r2))

            System.out.println("Rectangles Overlap");

        else

            System.out.println("Rectangles Don't Overlap");
    }
}

输出:

Rectangles Overlap

由于代码没有任何循环或递归,因此上述代码的时间复杂度为 O(1)

辅助空间: O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值