圆和矩形是否有重叠

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

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

问题描述

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

目录
相关文章
|
4月前
|
前端开发 JavaScript
canvas系列教程01——直线、三角形、多边形、矩形、调色板
canvas系列教程01——直线、三角形、多边形、矩形、调色板
97 0
圆角三角形,二次方贝塞尔曲线
圆角三角形,二次方贝塞尔曲线
|
6月前
|
Python
绘制圆
【5月更文挑战第9天】绘制圆。
45 2
|
11月前
|
人工智能 算法 BI
|
机器学习/深度学习 存储 人工智能
391. 完美矩形
391. 完美矩形
69 0
给定圆的半径r,求圆的面积。
给定圆的半径r,求圆的面积。
132 0
|
计算机视觉
五、OpenCV绘制线、矩形、圆等基本几何形状
通过javaOpenCV中的Imgproc函数进行简单几何图形的绘制
131 0
五、OpenCV绘制线、矩形、圆等基本几何形状
|
前端开发 JavaScript 数据可视化
用Canvas实现简单画图(线、三角形、矩形、圆)
👋因为在B站看到一个小demo是基于canvas写的,非常喜欢,然后上掘金大数据又给我推了 《Canvas 从入门到劝朋友放弃(图解版)》,就像上手一下canvas,本来不想写笔记的,因为《Canvas 从入门到劝朋友放弃(图解版)》自己看了一下挺全的,但本着输入要有输出,所以就有了这篇文章
245 0
|
C++
201312-3 最大的矩形
201312-3 最大的矩形
51 0
201312-3 最大的矩形