圆和矩形是否有重叠

简介: 圆和矩形是否有重叠

🎈 算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 ->圆和矩形是否有重叠

问题描述

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

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

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

示例 1 :

输入: radius = 1, xCenter = 0, yCenter = 0, x1 = 1, y1 = -1, x2 = 3, y2 = 1
输出: true
解释: 圆和矩形存在公共点 (1,0) 。

示例 2 :

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

示例 3 :

输入: radius = 1, xCenter = 0, yCenter = 0, x1 = -1, y1 = 0, x2 = 0, y2 = 1
输出: true

提示:

  • 1 <= radius <= 2000
  • -10^4 <= xCenter, yCenter <= 10^4
  • -10^4 <= x1 < x2 <= 10^4
  • -10^4 <= y1 < y2 <= 10^4

思路分析

首先我们应该要先理解一下题目意思,题目会给我们一个圆形和一个矩形的相关信息,我们需要判断给出的矩形和圆形是否会有重叠的部分,首先我们先分析一下矩形和圆形可能存在的位置情况:

  • 1、包含关系

矩形包含圆形或者圆形包含矩形,如下图:

  • 2、相切

内切的时候也是包含关系,所以这里只看外切的情况,如下图:

  • 3、相交

矩形和圆形有重叠部分,如下图:

  • 4、相离

矩形和圆形没有重叠部分,如下图:

我们再分析一下上面得出的4种情况,因为题目中说到包括点落在边界上的情况,所以相切时候的切点也算作是重叠的部分,也就是说1、2、3这三种情况都是满足题目条件的,这几种情况我们都可以通过圆心到矩形边上的距离来区分。

  • 圆心位于矩形的四边之间

x1 < xCenter < x2 && y1 < yCenter < y2,这时候肯定是包含关系或者相交关系,即一定符合题目要求,两个图形有重叠的部分。

  • 圆心位于矩形的四边之外

这时候圆形和矩形可能存在两种位置关系:相交或相离。我们可以通过计算圆心到矩形边上的距离来区分这两种位置情况:

如果圆心到矩形边上距离大于等于半径时,说明两个图形是相离的;

如果圆心到矩形边上的距离小于半径时,说明两个图形是相交的;

AC 代码

完整 AC 代码如下:

/**
 * @param {number} radius
 * @param {number} xCenter
 * @param {number} yCenter
 * @param {number} x1
 * @param {number} y1
 * @param {number} x2
 * @param {number} y2
 * @return {boolean}
 */
var checkOverlap = function (radius, xCenter, yCenter, x1, y1, x2, y2) {
  let dist = 0;
  if (xCenter < x1 || xCenter > x2) {
    dist += Math.min(Math.pow(x1 - xCenter, 2), Math.pow(x2 - xCenter, 2));
  }
  if (yCenter < y1 || yCenter > y2) {
    dist += Math.min(Math.pow(y1 - yCenter, 2), Math.pow(y2 - yCenter, 2));
  }
  return dist <= radius ** 2;
};

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,在此谢谢大家的支持,我们下文再见 🙌。

目录
相关文章
|
6月前
|
前端开发 JavaScript
canvas系列教程01——直线、三角形、多边形、矩形、调色板
canvas系列教程01——直线、三角形、多边形、矩形、调色板
169 0
|
人工智能 算法 BI
|
机器学习/深度学习 存储 人工智能
391. 完美矩形
391. 完美矩形
78 0
给定圆的半径r,求圆的面积。
给定圆的半径r,求圆的面积。
141 0
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
142 0
五、OpenCV绘制线、矩形、圆等基本几何形状
|
C++
201312-3 最大的矩形
201312-3 最大的矩形
59 0
201312-3 最大的矩形
杭电OJ变形 骨牌铺满方格 2501
杭电OJ变形 骨牌铺满方格 2501
110 0
在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。
编写Java程序:在画图软件中,可以画出不同大小或颜色的圆形、矩形等几何图形。几何图形之间有许多共同的特征,如它们可以是用某种颜色画出来的,可以是填充的或者不填充的。
|
Go 计算机视觉
寻找轮廓的中点
主要是回答网友提问,同时回顾主要知识。   #include "stdafx.h" #include  #include "opencv2/imgproc.hpp" #include "opencv2/videoio.
1153 0