[LeetCode 1401]圆和矩形是否有重叠

题目描述

给你一个以 (radius, xCenter, yCenter) 表示的圆和一个与坐标轴平行的矩形 (x1, y1, x2, y2) ,其中 (x1, y1) 是矩形左下角的坐标,而 (x2, y2) 是右上角的坐标。

如果圆和矩形有重叠的部分,请你返回 true ,否则返回 false 。

换句话说,请你检测是否 存在 点 (xi, yi) ,它既在圆上也在矩形上(两者都包括点落在边界上的情况)。

示例1

在这里插入图片描述

示例2

输入:radius = 1, xCenter = 1, yCenter = 1, x1 = 1, y1 = -3, x2 = 2, y2 = -1
输出:false

示例3

在这里插入图片描述

提示

1 <= radius <= 2000
− 1 0 4 < = x C e n t e r , y C e n t e r < = 1 0 4 -10^4 <= xCenter, yCenter <= 10^4 104<=xCenter,yCenter<=104
− 1 0 4 < = x 1 < x 2 < = 1 0 4 -10^4 <= x1 < x2 <= 10^4 104<=x1<x2<=104
− 1 0 4 < = y 1 < y 2 < = 1 0 4 -10^4 <= y1 < y2 <= 10^4 104<=y1<y2<=104

思路分析

参考这一篇知乎:怎样判断平面上一个矩形和一个圆形是否有重叠?

这里提到的几点关键点我觉得很巧妙:
1、使用矩形中心作为中心点,而不是圆心作为中心点;如果使用圆心作为中心点,则需要考虑矩形的四个角,情况较为复杂;
2、圆心投射到第一象限具有普适性。
在这里插入图片描述

代码

class Solution {
public:
    //https://www.zhihu.com/question/24251545
    bool checkOverlap(int r, int x, int y, int x1, int y1, int x2, int y2) {
        // xc和yc为矩形的中心点
        double xc = 1.0 * (x1 + x2) / 2;
        double yc = 1.0 * (y1 + y2) / 2;
        //(px, py)作为从矩形中心点指向圆心的向量
        double px = abs(x - xc), py = abs(y - yc);
        //(tx, ty)作为从矩形中心到矩形右上角的向量
        double tx = x2 - xc, ty = y2 - yc;
        //(rx, ry)作为p向量和t向量的减
        double rx = px - tx, ry = py - ty;
        //根据解答描述,如果为负则置0
        if(rx < 0) rx = 0;
        if(ry < 0) ry = 0;
        if(rx * rx + ry * ry <= r * r) 
            return true;
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值